屏幕关闭时的 iBeacon 事件

Posted

技术标签:

【中文标题】屏幕关闭时的 iBeacon 事件【英文标题】:iBeacon events while screen is off 【发布时间】:2015-05-07 12:26:03 【问题描述】:

我正在尝试基于 iBeacons 触发事件

当应用程序在前台、后台运行但未挂起(通过电源按钮关闭屏幕)时,它可以正常工作

我可以在锁定屏幕上看到 NSLog 消息,但在设备屏幕关闭时看不到。

有没有办法做到这一点?

AppDelegate.m:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    NSLog(@"applicationDidFinishLaunching");

    _locationManager = [[CLLocationManager alloc] init];
    _locationManager.delegate = self;

    [_locationManager requestAlwaysAuthorization];

    CLBeaconRegion *region;

    region = [[CLBeaconRegion alloc] initWithProximityUUID:[[NSUUID alloc] initWithUUIDString:@"EBEFD083-70A2-47C8-9837-E7B5634DF524"] major: 9 minor: 103 identifier: @"region1"];
    region.notifyEntryStateOnDisplay = YES;
    region.notifyOnEntry = YES;
    region.notifyOnExit = YES;
    [_locationManager startMonitoringForRegion:region];
    [_locationManager startRangingBeaconsInRegion:region];

    return YES;


- (void)locationManager:(CLLocationManager *)manager didDetermineState:(CLRegionState)state forRegion:(CLRegion *)region

    if(state == CLRegionStateInside) 
        NSLog(@"locationManager didDetermineState INSIDE for %@", region.identifier);
    
    else if(state == CLRegionStateOutside) 
        NSLog(@"locationManager didDetermineState OUTSIDE for %@", region.identifier);
    
    else 
        NSLog(@"locationManager didDetermineState OTHER for %@", region.identifier);
    


- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region

    if ( beacons.count > 0 )
    
        NSLog(@"locationManager didRangeBeacons: %@",beacons.description);
    

Info.plist(仅相关部分):

        <key>NSLocationAlwaysUsageDescription</key>
        <string>app location requested</string>
        <key>UIBackgroundModes</key>
        <array>
            <string>location</string>
            <string>voip</string>
            <string>bluetooth-peripheral</string>
            <string>bluetooth-central</string>
            <string>external-accessory</string>
        </array>

【问题讨论】:

您可以尝试在您的 plist 文件中添加“隐私 - 位置使用说明”键(如果您尚未添加)。 【参考方案1】:

LocationManager 的 pausesLocationUpdatesAutomatically 属性设置为“NO”,此属性设置为 NO 时,定位服务永远不会断电。但是您必须小心,因为将此属性设置为 NO 会显着增加设备的功耗。

【讨论】:

精准!但是,在应用程序暂停时执行的任何系统调用都会阻塞。【参考方案2】:

虽然信标监控(didEnterRegion:didExitRegion:)在后台工作,但信标测距(didRangeBeacons:inRegion:)仅在应用程序处于前台时工作,并且在有限的时间内的背景。这些后台限制包括应用因某个事件(例如由于您的设置region.notifyEntryStateOnDisplay = YES;而出现锁屏)而被唤醒到后台后的 5 秒

您可以采取一些技巧来获得额外的背景测距时间。在这里阅读:

http://developer.radiusnetworks.com/2014/11/13/extending-background-ranging-on-ios.html

【讨论】:

以上是关于屏幕关闭时的 iBeacon 事件的主要内容,如果未能解决你的问题,请参考以下文章

iOS屏幕关闭时如何继续监控iBeacon?

屏幕关闭时如何在 iOS 应用程序中检测 iBeacon?

iBeacon-App:从锁屏启动时的自定义代码

已终止的应用程序未使用 iBeacon 数据包唤醒

当应用程序被用户终止时的 iBeacon 通知(通过在任务视图中向上滑动)

iOS 7-iBeacon:当应用程序关闭时,如何从 iBeacon 获取比其 UUID 更多的数据?