iOS地理围栏,监控开始时在区域内如何处理?

2024-05-22

我一直无法弄清楚如何处理手机已经在某个区域内的情况startMonitoringForRegion叫做?其他问题建议致电requestStateForRegion inside didStartMonitoringForRegion然后调用该方法didDetermineState: forRegion:。所以代码看起来像这样:

- (void)viewDidLoad {
    //location manager set up etc...
    for (Object *object in allObjects){

        CLRegion *region = [self geofenceRegion:object];
        [locationManager startMonitoringForRegion:region];
     }
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {

    [self.locationManager requestStateForRegion:region];
    [self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5];
 }

- (void)locationManager:(CLLocationManager *)manager
  didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {

    if (state == CLRegionStateInside){
        [self locationManager:locationManager didEnterRegion:region];
    }  
}

现在显然,geofenceRegion 方法是我自己的,它工作得很好,并且对象包含诸如经纬度和半径之类的东西,所有这些都工作得很好,所以这不是这里的问题。

无论如何,上述代码的问题在于,如果用户在将区域添加到设备时已经位于该区域内(即 didEnterRegion 已完成),那么它确实可以工作。然而问题是该方法didDetermineState: forRegion:根据苹果文档,每次跨越其中一个边界区域时也会调用:

每当区域发生边界转换时,位置管理器都会调用此方法。除了调用 locationManager:didEnterRegion: 和 locationManager:didExitRegion: 方法之外,它还调用此方法。位置管理器还调用此方法来响应对其异步运行的 requestStateForRegion: 方法的调用。

现在正因为如此,每次进入一个区域时,didEnterRegion被自动调用,但随后又被再次调用,因为didDetermineState: forRegion:也会根据苹果文档自动调用,这会导致didEnterRegion再次被调用,因此当我只想输入一次时,该区域被输入两次。我怎样才能避免这种情况?

感谢您的帮助。

SOLUTION

解决方案真的很简单,我只是以错误的方式进行。我必须选择使用这两种方法didEnterRegion: and didExitRegion or use didDetermineState: forRegion并创建我自己的进入和退出该区域的方法,两者都不应该同时使用.

所以我选择只使用didDetermineState: forRegion方法和我的代码现在看起来像这样:

请注意,使用此方法,如果区域不在内部,则将调用退出区域,并且如果像我一样,您只想在输入发生后退出,则需要某种方法来检查该区域是否已被输入(我自己使用了核心数据,因为我已经使用它来存储该区域的其他方面)。

- (void)viewDidLoad {
    //location manager set up etc...
    for (Object *object in allObjects){

        CLRegion *region = [self geofenceRegion:object];
        [locationManager startMonitoringForRegion:region];
     }
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region {

    [self.locationManager performSelector:@selector(requestStateForRegion:) withObject:region afterDelay:5];
}

- (void)locationManager:(CLLocationManager *)manager
  didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region {

    if (state == CLRegionStateInside){

        [self enterGeofence:region];

    } else if (state == CLRegionStateOutside){

        [self exitGeofence:region];

    } else if (state == CLRegionStateUnknown){
        NSLog(@"Unknown state for geofence: %@", region);
        return;
    }
}

- (void)enterGeofence:(CLRegion *)geofence {

    //whatever is required when entered
}

- (void)exitGeofence:(CLRegion *)geofence {

    //whatever is required when exit
}

只是不使用位置管理器:didEnterRegion:根本就像locationManager:didDetermineState:forRegion:为您提供触发输入代码所需的所有信息,顺便说一句,该代码不应该是位置管理器:didEnterRegion:,使用您自己的选择器,该选择器不属于CLLocationManagerDelegate协议。

另一种方法是在开始监视区域时测试区域内部位置。这个解决方案听起来并不那么简单:您需要首先通过调用来更新当前位置开始更新位置,因为仅读取 locationManager 的位置属性可能会给您带来过时或极其不准确的读取。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS地理围栏,监控开始时在区域内如何处理? 的相关文章

  • UIButton 和滑动手势

    我有一个UIView有两个UIButton每侧 左侧和右侧 都有 s 和UIImageView在中心 点击任一按钮都会改变UIImageView那行得通 我想要滑动的能力UIView以及它改变UIImageView 现在 您必须在UIIma
  • 动态图标 iOS [重复]

    这个问题在这里已经有答案了 可能的重复 每天更改图标 https stackoverflow com questions 4038305 changing icon per day 如何制作动态图标 例如在日历中 每天该数字都会更改为当前值
  • 反应本机套接字 io 没有从客户端发出事件

    尝试将socket io client与react native 现在是ios 一起使用 到目前为止 连接 从客户端接收服务器端事件似乎工作正常 但是我似乎无法从客户端发出任何事件 Client var socket io http loc
  • 错误域=NSURLErrorDomain代码=-1017“该操作无法

    我刚刚开始 ios 开发 我正在尝试与我的 api 交换数据 当我执行 POST 请求时 一切正常 但当我尝试执行 GET 请求时 出现以下错误 错误域 NSURLErrorDomain代码 1017 该操作无法 完全的 NSURLErro
  • Emoji 字符无法编码为 JSON

    我有一个UITextView我称之为messageField 其中的数据messageField is POST ed 以 JSON 格式发送到服务器 当用户输入表情符号字符时 我无法将数据编码为JSON 我认为 Emoji 使用 Unic
  • 如何将 UIPopoverPresentationController 的高度设置为与 UITableView 相同

    我在我的应用程序上使用 UIPopoverPresentationController 在我的 iPhone 上显示弹出窗口 使用 UIModalPresentationNone 我希望尺寸随着 UITableView 的高度而动态变化 但
  • 在 Flurry 中记录比错误 ID 更多信息的方法?

    我目前使用 iOS 版 Flurry 5 4 0 我担心在方法方面是否能够记录更多信息 而不仅仅是错误 ID void logError NSString errorID message NSString message error NSE
  • 如何获取核心数据中现有实体(表)的列表

    如何获取核心数据中特定模式 托管对象模型 的现有实体 表 列表 我刚刚开始实施核心数据概念并坚持这些要点 就像是 SELECT COUNT FROM information schema tables WHERE table schema
  • iOS 中的内存泄漏,AVPlayer 永远不会被释放

    我使用了 AVPlayerDemo 示例苹果文档 https developer apple com library ios samplecode AVPlayerDemo Introduction Intro html并在其上编写了我自己
  • 在 SwiftUI 中折叠 doubleColumn NavigationView 详细信息,就像在 UISplitViewController 上折叠一样?

    因此 当我在 SwiftUI 中创建列表时 我可以 免费 获得主从拆分视图 例如 import SwiftUI struct ContentView View var people Angela Juan Yeji var body som
  • iOS 相互认证

    我正在尝试在 IOS 5 中实现相互身份验证 但遇到了麻烦 NSUnderlyingError Error Domain kCFErrorDomainCFNetwork Code 1200 An SSL error has occurred
  • 使用 AVMutableVideoCompositionLayerInstruction 旋转视频

    我正在 iPhone 4 上使用前置摄像头拍摄视频 并将视频与其他一些媒体资源结合起来 我希望该视频为纵向 所有视频的默认方向都是横向 在某些情况下 您必须手动管理 我正在使用 AVFoundation 特别是 AVAssetExportS
  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 如何以编程方式设置设备(UI)方向?

    希望屏幕 UI 上的所有内容都能够从横向左向右旋转 反之亦然 我该怎么做呢 这是私人的吗 我知道 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation inte
  • NSCalendar 返回明年第一周上周一的错误日期

    我使用下面的代码使用随机日期来计算上周一 哪个工作文件但我的代码在明年日期中断 下面是相同的代码 NSDate date NSDate dateWithTimeIntervalSince1970 1483620311 228 NSLog c
  • 使用 Protobuf-net,我收到有关 List 未知线路类型的异常

    我已经开始将 Unity iOS 游戏转换为使用 Protobuf net 保存状态 看起来一切正常 直到我将此实例变量添加到GameState ProtoMember 10 public List
  • 如何在 iOS 中通过 Twitter API 获取用户电子邮件地址?

    我尝试了多个 SDK 但无法从任何资源获取电子邮件 ID 我努力了FHSTwitterEngine为此目的 但我没有得到解决方案 FHSTwitterEngine twitterEngine FHSTwitterEngine sharedE
  • AFNetworking XML 请求问题

    我在用着AFNetworking 2使用 JSON 响应 它工作正常 现在我必须将其转换为 XML 而不是使用 JSON 因为服务器响应是 XML 格式的 在我搜索之后 我找到了这段代码 但它不起作用 与 Charles 我发现请求是错误的
  • 如何正确创建迦太基 cartfile?

    我正在研究购物车文件 迫不及待地想 简单地创建一个购物车文件 就像所有说明所说的那样 只是 如何 简单地 创建一个 Cartfile 我创建了一个纯文本文档 将其命名为 cartfile 并在其中复制了一些依赖项 Ran carthage
  • 使用 NSString 进行 UTF8 解码

    我是 Objective C 新手 尝试使用以下示例将格式错误的 UTF8 编码 NSString 转换为格式良好的字符串苹果文档 http developer apple com library mac documentation Coc

随机推荐