didEnterRegion 仅在设备唤醒时触发
Posted
技术标签:
【中文标题】didEnterRegion 仅在设备唤醒时触发【英文标题】:didEnterRegion only fired on device wake up 【发布时间】:2014-04-30 14:28:33 【问题描述】:我在我的应用中使用由iBeacon
s 触发的本地通知。只要 iPhone 处于活动状态,它在前台和后台都可以正常工作,但在大约 15 分钟不活动或重新启动后不会触发 didEnterRegion
。
然后它只会在使用主页按钮或睡眠按钮唤醒 iPhone 时再次触发,但我希望didEnterRegion
在 iPhone 在口袋中 15 分钟或更长时间时“触发”同时进入该区域.
这可能吗?如果是,怎么做?
后台模式 > 位置更新已禁用
一些代码:
.h
@property (strong, nonatomic) CLBeaconRegion *beaconRegion;
@property (strong, nonatomic) CLLocationManager *locationManager;
.m
- (void)start
self.beaconRegion = [[CLBeaconRegion alloc] initWithProximityUUID:uuid identifier:@"com.bla.bla"];
self.beaconRegion.notifyOnEntry = YES;
self.beaconRegion.notifyOnExit = YES;
self.beaconRegion.notifyEntryStateOnDisplay = YES;
self.locationManager.desiredAccuracy = kCLLocationAccuracyThreeKilometers;
[self.locationManager startUpdatingLocation];
[self.locationManager startMonitoringForRegion:self.beaconRegion];
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
[self.locationManager requestStateForRegion:self.beaconRegion];
- (void)locationManager:(CLLocationManager *)manager didEnterRegion:(CLRegion *)region
[self.locationManager startRangingBeaconsInRegion:self.beaconRegion];
-(void)locationManager:(CLLocationManager *)manager didExitRegion:(CLRegion *)region
[self.locationManager stopRangingBeaconsInRegion:self.beaconRegion];
- (void)locationManager:(CLLocationManager *)manager monitoringDidFailForRegion:(CLRegion *)region withError:(NSError *)error
NSLog(@"%@", [error localizedDescription]);
-(void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region
if (state == CLRegionStateInside)
[manager startRangingBeaconsInRegion:self.beaconRegion];
else
[manager stopRangingBeaconsInRegion:self.beaconRegion];
【问题讨论】:
【参考方案1】:我不确定这里发生了什么,但问题中描述的体验与我在多个设备上看到的测试不一致。发布设置它的代码可能有助于找出一些答案。
在几个应用程序中,我已经能够获得后台didEnterRegion
回调,即使在没有按肩部按钮或主页按钮的情况下闲置超过 15 分钟也是如此。为此,我不必设置任何背景模式。 (如果您将应用程序提交到商店并不必要地设置了后台模式位置更新,Apple 实际上会拒绝您的应用程序。)
ios 7.1 中存在一个错误,它会在启动后的某个时间点停止 iBeacon 检测,所以也许这就是这种情况下发生的情况。详细信息是here。不幸的是,测试这个假设需要您唤醒屏幕以关闭和打开蓝牙以清除条件,这将唤醒您的屏幕并让您退出区域。也许您可以尝试设置beaconregion.notifyEntryStateOnDisplay=NO
,重新创建此条件,然后尝试循环蓝牙以查看您是否收到通知。您还可以使用现成的信标扫描应用程序(如Locate for iBeacon)来查看您的设备在进入此状态后是否能够针对 iBeacon 进行范围,如果您无法检测到 iBeacon,则仅循环到蓝牙。
【讨论】:
我添加了一些代码。打开/关闭蓝牙和 notifyEntryStateOnDisplay=NO 没有结果。在这种情况下,这不是 7.1 的错误。 notifyEntryStateOnDisplay=NO 毕竟似乎可以解决问题。我认为developer.apple.com/library/ios/documentation/CoreLocation/… 的文档不是很清楚。应该说,当此属性设置为 YES 时,信标通知将仅在唤醒时发送 这是一个令人惊讶的观察结果。我不确定有什么区别,但这与我在这里的观察不一致:developer.radiusnetworks.com/2013/11/13/…以上是关于didEnterRegion 仅在设备唤醒时触发的主要内容,如果未能解决你的问题,请参考以下文章
使用 didEnterRegion 唤醒一个被杀死的应用程序,然后扫描 iBeacon
仅在调用 requestAlwaysAuthorization 时才调用 DidEnterRegion。信标