iOS requestStateForRegion 在 didStartMonitoringFor 之后返回 .unknown

标签 ios objective-c core-location geofencing

对为什么我的 AppDelegate CLLocationManager 有时无法成功确定 CLRegionState (CLRegionState.unknown) 感到困惑,即使我确保在 didStartMonitoringForRegion 之前不会调用 requestStateForRegion。似乎是某种竞争条件,我不明白我是如何处理的。

相关,得到CLRegionState.unknown怎么办?一直请求状态直到我得到什么? (这看起来很糟糕)

应用委托(delegate):

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{   
    self.locationManager = [[CLLocationManager alloc] init];
    [self.locationManager setDelegate:self];

    return [super application:application didFinishLaunchingWithOptions:launchOptions];
}

- (void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(nonnull CLRegion *)region {
    NSLog(@"%@", [NSString stringWithFormat:@"didStartMonitoringFor region with ID: %@", region.identifier]);
    // delay per https://stackoverflow.com/a/33288103/3380970
    double delayInSeconds = 2.0;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void) {
        [self.locationManager requestStateForRegion:region];
    });
}

- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(nonnull CLRegion *)region {
    NSLog(@"%@", [NSString stringWithFormat:@"didDetermineState from AppDelegate CLLocationManager: %@ (%ld)", region.identifier, (long)state ]);
    NSString *baseUrl = [self fetchBaseUrl];
    switch (state) {
        case CLRegionStateInside:
            NSLog(@"%@", @"Determined .inside state for geofence");
            [HelperFunctions postGeofenceTransitionWithBaseUrl:baseUrl region:region transitionType:1];
            break;
        default:
            break;
    }
}

摘要日志:

Adding geofence with ID: 5:90fd74e0-cbc7-dbe5-20fc-b870203055e1    
Adding geofence with ID: 8:d408f466-ea1b-6cbb-382f-f7567db61157
Adding geofence with ID: 7:ba97dda2-39a7-9b95-8ea9-ea183d69a858

didStartMonitoringFor region with ID: 5:90fd74e0-cbc7-dbe5-20fc-b870203055e1
didStartMonitoringFor region with ID: 8:d408f466-ea1b-6cbb-382f-f7567db61157
didStartMonitoringFor region with ID: 7:ba97dda2-39a7-9b95-8ea9-ea183d69a858

didDetermineState from AppDelegate CLLocationManager: 5:90fd74e0-cbc7-dbe5-20fc-b870203055e1 (0)
didDetermineState from AppDelegate CLLocationManager: 8:d408f466-ea1b-6cbb-382f-f7567db61157 (0)
didDetermineState from AppDelegate CLLocationManager: 7:ba97dda2-39a7-9b95-8ea9-ea183d69a858 (0)

谢谢

最佳答案

这是因为你在 block 中使用了入口参数region,而没有将其设为 block 变量。

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

__block CLRegion *blockRegion = region;

并在 block 内使用 blockRegion

关于iOS requestStateForRegion 在 didStartMonitoringFor 之后返回 .unknown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54425265/

相关文章:

ios - iOS多窗口自动旋转

ios - <FIRInstanceID/WARNING> 无法将 iid-token 保存到钥匙串(keychain)时出错 Error Domain=com.google.iid Code=-34018 "(null)"

iphone - CABasicAnimation 运行时 UITextView 滚动缓慢

iOS 位置管理器比每秒更新一次更频繁

ios - 提醒用户该应用仍在使用位置更新 (GPS)

android - 移动应用程序中的用户身份验证

ios - 使用 iOS 9 的启动图像未出现在主屏幕 Web 应用程序上

ios - 当键盘出现在 4s 、 5 和 5s 等小屏幕上时如何向上移动 View 但是当它进入 iphone 6 时 View 不应该向上移动

ios - 在ios中将带有键的数组添加到字典中

ios - 在 iOS 上升级应用程序时重置位置服务权限