是否可以在准确的时间(或延迟后)唤醒iOS应用程序并与外围设备通信?我的目标是设置一个闹钟,并在铃声响起时与外围设备通信。我能猜到的唯一解决方案是在那个时候发送一个远程(推送)通知,它将唤醒应用程序,然后它可以与BLE设备通信。但这种方式是不可接受的,因为不能保证推送将在确切的时间交付,或者根本不会交付。
那么,有没有可能在使用CoreBluetooth的确切时间唤醒应用程序?
发布于 2015-02-21 05:20:26
AFAIK,鉴于你的限制,这是不可能的。你不能在任何时候唤醒你想要的背景应用。唯一接近这一点的是,如果BLE外围设备是应用程序正在进行区域监控的iBeacon,并且当您进入区域时,您的应用程序将被didEnterRegion
事件唤醒。在你的例子中,它听起来不像是一个iBeacon,而且它听起来会一直在附近。
你根本不能在你想要的时候唤醒一个iOS应用。
发布于 2015-02-21 05:21:44
您可以使用fireDate
属性发送要在特定时间触发的本地通知。也就是说,它只会触发本地通知。您不能因为本地(或推送)通知而启动对BTLE外围设备的后台搜索。用户必须启动你的应用程序。
可以在后台搜索BTLE外围设备,但如果您的应用程序不在后台运行,这显然不会起作用。如果你的外设碰巧是iBeacon,iOS会让你的应用活跃起来,即使它不是在后台运行的,只要你进入iBeacon的范围。您可以使用CLBeaconRegion
来实现此效果。
发布于 2015-02-26 23:46:38
Core Bluetooth now supports background restoration。不过,这需要做一些工作才能正确。如果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);
https://stackoverflow.com/questions/28636383
复制相似问题