我在我的应用中使用由iBeacon
触发的本地通知。只要iPhone处于活动状态,它在前台和后台都可以正常工作,但在大约15分钟不活动或重启后不会触发didEnterRegion
。
然后只有在使用主页按钮或睡眠按钮唤醒iPhone时才会再次触发,但是当进入该区域时,当iPhone放入口袋15分钟或更长时间时,我希望didEnterRegion
“触发”同样。
这可能吗?如果是,怎么样?
背景模式>位置更新已停用
一些代码:
·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];
}
}
答案 0 :(得分:1)
我不确定这里发生了什么,但问题中描述的经验与我在多个设备上测试的内容不一致。发布设置此代码的代码可能有助于找出答案。
在多个应用中,我已经能够获得后台didEnterRegion
回调,即使在超过15分钟不活动但没有按下肩部按钮或主页按钮的情况下也是如此。要做到这一点,我不必设置任何后台模式。 (如果您将应用程序提交到商店,并且背景模式不必要地设置位置更新,Apple将拒绝您的应用。)
iOS 7.1中存在一个错误,可以在启动后的某个时刻暂停iBeacon检测,因此这可能就是这种情况。详细信息为here。不幸的是,测试这个假设需要你唤醒屏幕,以便关闭和打开蓝牙以清除条件,这会唤醒你的屏幕,无论如何都会给你区域退出。也许你可以尝试设置beaconregion.notifyEntryStateOnDisplay=NO
,重新创建这个条件,然后尝试循环蓝牙,看看你是否收到通知。您还可以使用现成的信标扫描应用程序Locate for iBeacon来查看您的设备在进入此状态后是否能够为iBeacon设置范围,并且只有在您无法检测到iBeacons时才会循环到蓝牙。