我在应用程序中使用由iBeacon
触发的本地通知。只要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];
}
}
我不确定这里发生了什么,但问题中描述的体验与我在多台设备上看到的测试不一致。发布设置代码可能有助于找出一些答案。
在几个应用程序中,我能够获得后台didEnterRegion
回调,即使在不按下肩部按钮或主页按钮的情况下不活动超过15分钟。为了做到这一点,我不需要设置任何背景模式。(如果你将应用程序提交给商店,并设置了不必要的后台模式位置更新,苹果实际上会拒绝你的应用程序。(
iOS 7.1中有一个错误,它会在启动后的某个时间点停止iBeacon检测,所以也许这就是这种情况下发生的情况。详情在这里。不幸的是,测试这个假设需要你唤醒屏幕才能关闭和打开蓝牙来清除这种情况,这会唤醒你的屏幕并让你退出该区域。也许你可以尝试设置beaconregion.notifyEntryStateOnDisplay=NO
,重新创建这个条件,然后尝试循环蓝牙,看看你是否收到通知。你也可以使用现成的信标扫描应用程序,如Locate for iBeacon,看看你的设备在进入这种状态后是否能够测距iBeacons,并且只有在你无法检测到iBeacons的情况下才能循环到蓝牙。