首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >iOS8 - BLE唤醒应用程序

iOS8 - BLE唤醒应用程序
EN

Stack Overflow用户
提问于 2015-02-21 03:04:20
回答 3查看 1.7K关注 0票数 1

是否可以在准确的时间(或延迟后)唤醒iOS应用程序并与外围设备通信?我的目标是设置一个闹钟,并在铃声响起时与外围设备通信。我能猜到的唯一解决方案是在那个时候发送一个远程(推送)通知,它将唤醒应用程序,然后它可以与BLE设备通信。但这种方式是不可接受的,因为不能保证推送将在确切的时间交付,或者根本不会交付。

那么,有没有可能在使用CoreBluetooth的确切时间唤醒应用程序?

EN

回答 3

Stack Overflow用户

发布于 2015-02-21 05:20:26

AFAIK,鉴于你的限制,这是不可能的。你不能在任何时候唤醒你想要的背景应用。唯一接近这一点的是,如果BLE外围设备是应用程序正在进行区域监控的iBeacon,并且当您进入区域时,您的应用程序将被didEnterRegion事件唤醒。在你的例子中,它听起来不像是一个iBeacon,而且它听起来会一直在附近。

你根本不能在你想要的时候唤醒一个iOS应用。

票数 0
EN

Stack Overflow用户

发布于 2015-02-21 05:21:44

您可以使用fireDate属性发送要在特定时间触发的本地通知。也就是说,它只会触发本地通知。您不能因为本地(或推送)通知而启动对BTLE外围设备的后台搜索。用户必须启动你的应用程序。

可以在后台搜索BTLE外围设备,但如果您的应用程序不在后台运行,这显然不会起作用。如果你的外设碰巧是iBeacon,iOS会让你的应用活跃起来,即使它不是在后台运行的,只要你进入iBeacon的范围。您可以使用CLBeaconRegion来实现此效果。

票数 0
EN

Stack Overflow用户

发布于 2015-02-26 23:46:38

Core Bluetooth now supports background restoration。不过,这需要做一些工作才能正确。如果iOS因为内存压力而终止您的应用程序,当它检测到连接尝试时,它将尝试在后台恢复您的应用程序,包括您正在广告的任何服务和特征。

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

然后你需要给你的CBPeripheralManager一个唯一的标识符(我在application:didFinishLaunching:withOptions AppDelegate.m中做到了这一点):

代码语言:javascript
运行
复制
 myCentralManager =
        [[CBCentralManager alloc] initWithDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) options:@{ CBCentralManagerOptionRestoreIdentifierKey:@"myCentralManagerIdentifier" }];

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

代码语言:javascript
运行
复制
- (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将再次发布广告,因此,如果您要将特征保存到属性中,请小心不要再次覆盖它们。

您可以通过调用以下命令来模拟内存终止:

代码语言:javascript
运行
复制
kill(getpid(), SIGKILL);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28636383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档