iOS8-BLE唤醒应用程序
是否可以在准确的时间(或延迟一段时间后)唤醒iOS应用程序并与外围设备通信?我的目标是设置一个警报,并在铃响时与外设通信。 我能猜到的唯一解决方案是在那个时候发送一个远程(推送)通知,该通知将唤醒应用程序,然后它可以与BLE设备通信。但这种方式是不可接受的,因为无法保证推送会在准确的时间交付或完全交付。iOS8-BLE唤醒应用程序,ios,objective-c,xcode,bluetooth-lowenergy,core-bluetooth,Ios,Objective C,Xcode,Bluetooth Lowenergy,Core Bluetooth,是否可以在准确的时间(或延迟一段时间后)唤醒iOS应用程序并与外围设备通信?我的目标是设置一个警报,并在铃响时与外设通信。 我能猜到的唯一解决方案是在那个时候发送一个远程(推送)通知,该通知将唤醒应用程序,然后它可以与BLE设备通信。但这种方式是不可接受的,因为无法保证推送会在准确的时间交付或完全交付。 那么,是否有可能在使用CoreBluetooth的确切时间唤醒应用程序?好的,鉴于您的限制,这是不可能的。你不能在任何时候唤醒一个后台应用程序。唯一远程接近这一点的是,如果BLE外围设备是应用程
那么,是否有可能在使用CoreBluetooth的确切时间唤醒应用程序?好的,鉴于您的限制,这是不可能的。你不能在任何时候唤醒一个后台应用程序。唯一远程接近这一点的是,如果BLE外围设备是应用程序进行区域监控的iBeacon,当您进入该区域时,您的应用程序将被一个
dienterRegion
事件唤醒。在你的情况下,它听起来不像是一个iBeacon,而且它似乎一直都在附近
您无法在需要的时候完全唤醒iOS应用程序。您可以使用
fireDate
属性发送本地通知,在特定时间触发。也就是说,它只会触发本地通知。由于本地(或推送)通知,您无法启动BTLE外围设备的后台搜索。用户必须启动你的应用程序
可以在后台搜索BTLE外围设备,但是如果你的应用程序没有在后台运行,那么显然是行不通的。如果你的外设恰好是一个iBeacon,如果你输入了iBeacon的范围,即使你的应用程序没有在后台运行,iOS也会让你的应用程序充满活力。您可以使用CLBeaconRegion
来实现此效果。。不过,这需要一点努力才能恢复正常。如果iOS因为内存压力而终止你的应用程序,当它检测到连接尝试时,它会尝试在后台恢复你的应用程序,包括你正在宣传的任何服务和特征
首先,您需要将info.plist文件中的UIBackgroundModes
设置为蓝牙外围设备
然后,您需要为您的CBPeripheralManager提供一个唯一标识符(我在应用程序:didFinishLaunching:with options
AppDelegate.m
中这样做):
然后需要实现外围设备恢复委托方法:
- (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);
它可能值得尝试发送一个本地通知计划在那个时候,一个没有警告文本,但内容可用的标志。不知道它是否能工作,但值得几分钟来测试。事实上,目前警报已经通过本地通知工作,但问题是我们不能用本地通知唤醒应用程序,而只能用远程(推送)通知。您可以安排本地通知,但您仍然不太清楚何时要唤醒。什么是“铃声”?请提供更多细节。@MarcusAdams我的意思是如下。用户打开应用程序并设置他想醒来的时间。当他设定时间时,它基本上是安排一个本地通知,带有警报文本和一些声音,将在用户设定的时间触发。请再次阅读我的问题。正如我所写的,我知道推送通知解决方案,但在我的情况下,我不能使用。这也能在设备重启后继续存在吗?不,很遗憾,不能,因为iOS不会在重启时自动启动应用程序的广告/扫描。如果您从应用程序切换程序强制退出,则与此相同。
kill(getpid(), SIGKILL);