iOS 7 CoreLocation:在授权位置服务后,区域监控首次失败
我使用CoreLocation在我的应用上发现了一个奇怪的行为。 我正在使用区域监视function,但在授权位置服务(通过弹出或设置 – >位置服务)后,区域监视失败(操作无法完成.kCLErrorDomain错误5.)。 如果我关闭应用程序并重新启动(因此已经授权),一切都按预期工作。 我的代码如下所示:
-(void)initializeLocationServices { NSLog(@"Started location services"); locationManager = [[CLLocationManager alloc] init]; locationManager.delegate = self; locationManager.distanceFilter = kCLDistanceFilterNone; locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation; locationManager.pausesLocationUpdatesAutomatically = NO; [locationManager startUpdatingLocation]; // to show authorisation popup } -(CLCircularRegion*)createRegion { // Test coordinates CLLocationDegrees latitude = 50; CLLocationDegrees longitude = -1; CLLocationDistance radius = 50; // meters; // If radius is too large, registration fails automatically, so limit the radius to the maximum value if (radius > locationManager.maximumRegionMonitoringDistance) { radius = locationManager.maximumRegionMonitoringDistance; } CLCircularRegion* region = [[CLCircularRegion alloc] initWithCenter:CLLocationCoordinate2DMake(latitude, longitude) radius:radius identifier:@"TEST"]; region.notifyOnEntry = YES; region.notifyOnExit = YES; NSLog(@"Created region"); return region; } -(void)monitorProximity { CLRegion *region = [self createRegion]; // Check if support is unavailable if ( ![CLLocationManager isMonitoringAvailableForClass:[CLRegion class]]) { NSLog( @"Failed to initialise region monitoring: support unavailable"); return; } // Check if authorised if ([CLLocationManager authorizationStatus] != kCLAuthorizationStatusAuthorized) { NSLog( @"Failed to initialise region monitoring: app not authorized to use location services"); return; } else { NSLog(@"Started monitoring proximity"); } // Clear out any old regions to prevent buildup. if ([locationManager.monitoredRegions count] > 0) { for (id obj in locationManager.monitoredRegions) [locationManager stopMonitoringForRegion:obj]; } [locationManager startMonitoringForRegion:region]; } -(void)locationManager:(CLLocationManager *)manager didStartMonitoringForRegion:(CLRegion *)region { NSLog(@"Started monitoring for region: %@", [region description]); [locationManager requestStateForRegion:region]; // check if already inside region } -(void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error { NSLog(@"Failed to start monitoring for region: %@", [error localizedDescription]); } -(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region { NSLog(@"didDetermineState"); if (state == CLRegionStateInside) { NSLog(@"inside"); return; } else if (state == CLRegionStateOutside) { NSLog(@"outside"); } else { NSLog(@"unknown"); } } -(void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region { NSLog(@"didEnterRegion"); } -(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region { NSLog(@"didExitRegion"); } -(void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { NSLog(@"Monitoring authorisation status is now: %@", status == kCLAuthorizationStatusAuthorized ? @"authorized" : @"not authorized"); if (status == kCLAuthorizationStatusAuthorized) { [self monitorProximity]; } }
我在这里做错了吗? 调用didChangeAuthorizationStatus后,我的流程有问题吗?
从其他用户报告来看,似乎kCLErrorDomain 5
是一个’catch all’,用于区域监控失败; 它没有提供太多有用的信息。 我相信你的问题是由线路造成的
[locationManager requestStateForRegion:region]; // check if already inside region
你在委托方法didStartMonitoringForRegion:
我在自己的项目中看到了一些非常相似的东西,并将这一行(或延迟执行一段时间)解决了这个问题。 我最好的猜测是,当这个委托方法触发时,iOS仍在运行一些内部区域监控代码,因此现在不适合调用requestStateForRegion:
尝试解决这个问题,看看它是否是答案。
kCLErrorDomain代码/错误5表示您已尝试监视超过20个CLRegions。 这里描述
请参阅startMonitoringForRegion说明它说:
一个应用程序一次最多可以注册20个区域。 为了及时报告区域变化,区域监测服务需要网络连接。
kCLErrorDomain
5
是一个捕获所有可能意味着许多不同的东西。
其中一个来源是当你调用[locationManager requestStateForRegion:region]
,当你第一次监视一个区域时你需要知道你是否已经在该区域。 这是因为只有在您实际进入该区域时才会调用didEnter区域。 通常这意味着您第一次监视该区域时,必须等待5秒钟,直到未检测到该区域,然后才会在下次您在该区域时输入区域。
有许多不同的报告原因导致问题:
- 确保监控的信标不超过20个
-
5
表示“regionMonitoringFailure”。 确保半径不太大(与信标监控无关)。 - 确保注册位置更新
- 省略调用requestStateForRegion,但是我在上面描述了为什么需要这样做。
- 重启设备和蓝牙可能会有所帮助
- 尝试30秒延迟
然而,这些都不适合我。 我认为我的根本原因类似于iOS 7.1错误,它只是随机停止在某些设备上工作。 我尝试重启并重新启动蓝牙,没有任何帮助。
不知道我做了什么,但我第二天早上醒来,它又开始工作了。
基本上你可能想尝试不同的设备,直到另一个设备再次开始工作。
- Xcode 9.3并更新到High Sierra:即使在完全重新安装后,Instruments也无法打开* .tracetemplate文件
- React Native IOS 11.3 – 11.4错误:JavaScriptCore JSC :: JSLock :: DropAllLocks :: DropAllLocks
- 如何使一个Http得到并在Swift中设置httpHeader?
- Apple商店和Iframe应用程序
- 如何在表格视图中一次select单选button
- requestInterstitialAdPresentation只能工作一次
- 在Facebook iOS应用程序的时间轴中添加一个浮动栏到滚动视图
- 在Swift中编写网络层:库创建
- 集成在React Native上找不到的现有应用程序iOS“React / RCTEventDispatcher.h”文件
- 为什么这个代码使用presentModalViewController? (不是pushViewController)
- 我无法捕捉到WKWebView的截图