didEnterRegion仅在设备唤醒时触发

时间:2014-04-30 14:28:33

标签: ios ibeacon clregion

我在我的应用中使用由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];
    }
}

1 个答案:

答案 0 :(得分:1)

我不确定这里发生了什么,但问题中描述的经验与我在多个设备上测试的内容不一致。发布设置此代码的代码可能有助于找出答案。

在多个应用中,我已经能够获得后台didEnterRegion回调,即使在超过15分钟不活动但没有按下肩部按钮或主页按钮的情况下也是如此。要做到这一点,我不必设置任何后台模式。 (如果您将应用程序提交到商店,并且背景模式不必要地设置位置更新,Apple将拒绝您的应用。)

iOS 7.1中存在一个错误,可以在启动后的某个时刻暂停iBeacon检测,因此这可能就是这种情况。详细信息为here。不幸的是,测试这个假设需要你唤醒屏幕,以便关闭和打开蓝牙以清除条件,这会唤醒你的屏幕,无论如何都会给你区域退出。也许你可以尝试设置beaconregion.notifyEntryStateOnDisplay=NO,重新创建这个条件,然后尝试循环蓝牙,看看你是否收到通知。您还可以使用现成的信标扫描应用程序Locate for iBeacon来查看您的设备在进入此状态后是否能够为iBeacon设置范围,并且只有在您无法检测到iBeacons时才会循环到蓝牙。