繁体   English   中英

iOS8-BLE唤醒应用

[英]iOS8 - BLE wake up app

是否可以在准确的时间(或一段时间后)唤醒iOS应用并与外围设备通信? 我的目标是在响铃时设置警报并与外围设备进行通信。 我能猜到的唯一解决方案是在那时发送一个远程(推送)通知,这将唤醒应用程序,然后它可以与BLE设备通信。 但是这种方式是不可接受的,因为不能保证推送将在准确的时间交付或完全交付。
那么有可能在使用CoreBluetooth的确切时间唤醒应用程序吗?

AFAIK,鉴于您的限制,这是不可能的。 您随时都无法唤醒后台运行的应用程序。 唯一接近这一点的是,如果BLE外设是该应用程序正在对其进行区域监视的iBeacon,并且当您进入该区域时,您的应用程序将被didEnterRegion事件唤醒。 在您的情况下,听起来好像不是iBeacon,而且听起来好像一直都在附近。

您根本无法在需要时完全唤醒iOS应用

您可以使用fireDate属性发送本地通知以在特定时间触发。 也就是说,它只会触发本地通知。 由于本地(或推送)通知,您无法启动BTLE外设的后台搜索。 用户将必须启动您的应用程序。

可以在后台搜索BTLE外围设备,但是如果您的应用程序不在后台运行,那显然是行不通的。 如果您的外围设备恰好是iBeacon,则即使您未输入iBeacon的范围,iOS也会使您的应用程序栩栩如生。 您可以使用CLBeaconRegion实现此效果。

核心蓝牙现在支持背景恢复 但是需要一些工作才能正确。 如果iOS由于内存不足而终止了您的应用程序,则它将在检测到连接尝试(包括您宣传的任何服务和特征)时尝试在后台还原您的应用程序。

首先,您需要将info.plist文件中的UIBackgroundModes设置为bluetooth-peripheral

然后,您需要为CBPeripheralManager提供一个唯一的标识符(我在application:didFinishLaunching:withOptions AppDelegate.m这样做):

 myCentralManager =
        [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:@{ CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier" }];

然后,您需要实现外围恢复委托方法:

- (void)peripheralManager:(CBPeripheralManager *)peripheral
         willRestoreState:(NSDictionary *)dict
{
    NSArray *services = dict[CBPeripheralManagerRestoredStateServicesKey];

    // Loop through services
    for (CBMutableService *service in services) {

        // Then characteristics
        for (CBCharacteristic *characteristic in service.characteristics) {

            // Then any centrals that were subscribed
            for (CBCentral* central in characteristic.subscribedCentrals) {

            }
        }
    }
}

此时,您的CBPerpheralManager会再次发布广告,因此,如果将特征保存到属性中,请再次覆盖特征。

您可以通过调用以下方法模拟内存终止:

kill(getpid(), SIGKILL);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM