Ios7 蓝牙中心区域后台监控和/或锁定(无显示)

Ios7 蓝牙中心区域后台监控和/或锁定(无显示),ios7,core-location,core-bluetooth,ibeacon,cbcentralmanager,Ios7,Core Location,Core Bluetooth,Ibeacon,Cbcentralmanager,我的问题是:当手机处于锁定状态(未打开显示器)或处于后台时,如何从中央启动连续监控 首先,我使用的是Christopher Mann@提供的iBeaconDemo,我并不认为我写了这个演示,但我用它来理解iBeacons和区域监控。这是一个很棒的演示,但我希望它启用了后台监控,以便在您进入近距离时显示本地通知 我已在我的功能(info.plist)文件中启用了bluetooth central、bluetooth peripheral和locations,并将.notifyOnDisplay、n

我的问题是:当手机处于锁定状态(未打开显示器)或处于后台时,如何从中央启动连续监控

首先,我使用的是Christopher Mann@提供的iBeaconDemo,我并不认为我写了这个演示,但我用它来理解iBeacons和区域监控。这是一个很棒的演示,但我希望它启用了后台监控,以便在您进入近距离时显示本地通知

我已在我的功能(info.plist)文件中启用了bluetooth central、bluetooth peripheral和locations,并将.notifyOnDisplay、notifyOnEntry和notifyOnExit设置为YES,发现我在应用程序位于前台或锁定屏幕时(在手机锁定时按home按钮)获得结果但我无法让它在后台(手机处于解锁状态)或手机处于锁定状态(未显示)时进行监控

这是我的appDelegate的didEnterBackground方法(注意:这是一个不同的本地通知,每次都能正常工作,但与我输入区域时希望显示的通知不同:

    - (void)applicationDidEnterBackground:(UIApplication *)application {
    NSLog(@"Application entered background state.");
    [[UIApplication sharedApplication] cancelAllLocalNotifications];

    // create local notification and present it immediately
    UILocalNotification *notification = [self createLocalNotification:@"Bring app back to foreground"];
    [[UIApplication sharedApplication] presentLocalNotificationNow:notification];
}
以下是我想在后台显示的通知,我只需要在进入区域后弹出一个通知(我在每个区域中放置一个用于测试):

最后,以下是fireUpdateNotificationsForStatus方法,如果这可能有用:

    - (void)fireUpdateNotificationForStatus:(NSString*)status {
    // fire notification to update displayed status
    [[NSNotificationCenter defaultCenter] postNotificationName:kLocationUpdateNotification
                                                        object:Nil
                                                      userInfo:@{@"status" : status}];
}

如果有任何其他有用的帮助,请随时告诉我。谢谢您的时间!

假设用户收到通知(您确实使用日志记录而不是通知来测试了这一点,对吗?),您的问题是后台处理:

iOs和后台扫描有点古怪,您可以做以下几件事:

  • 在应用程序中设置UiBackgroundModes=位置权限
  • region.notifyEntryStateOnDisplay=YES确保屏幕解锁时您将收到didRangeBeacons(您似乎有此功能)
  • locationManager.pausesLocationUpdatesAutomatically=否;否则,当iOs确定用户不再移动时,会偶尔关闭测距功能
  • 也可以使用startUpdatingLocation,desiredAccuracy=KCllocationAccuracyThreekm;你也会得到无用的GPS线,但这显然会让iOs无法停止信标测距

另请参见

为什么使用
[[UIApplication sharedApplication]cancelAllLocalNotifications]应用程序何时进入后台?主要用于测试目的。我这样做是为了清除上次运行时可能留下的任何旧的/未完成的通知,以便在再次运行应用程序时有一个干净的通知中心。您使用什么代码响应在
fireUpdateNot中生成的通知事件通知状态:
method?该方法是否应该调用
[[UIApplication sharedApplication]presentLocalNotificationNow:notification]
相反?在didRangeBeacons委托方法中,它调用fireUpdateNotificationForStatus方法,但对于每种情况的范围(I,N,F),它也会在其后调用presentLocalNotificationNow方法。我是否正确理解您的要求?
    - (void)fireUpdateNotificationForStatus:(NSString*)status {
    // fire notification to update displayed status
    [[NSNotificationCenter defaultCenter] postNotificationName:kLocationUpdateNotification
                                                        object:Nil
                                                      userInfo:@{@"status" : status}];
}