Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/106.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS8-BLE唤醒应用程序_Ios_Objective C_Xcode_Bluetooth Lowenergy_Core Bluetooth - Fatal编程技术网

iOS8-BLE唤醒应用程序

iOS8-BLE唤醒应用程序,ios,objective-c,xcode,bluetooth-lowenergy,core-bluetooth,Ios,Objective C,Xcode,Bluetooth Lowenergy,Core Bluetooth,是否可以在准确的时间(或延迟一段时间后)唤醒iOS应用程序并与外围设备通信?我的目标是设置一个警报,并在铃响时与外设通信。 我能猜到的唯一解决方案是在那个时候发送一个远程(推送)通知,该通知将唤醒应用程序,然后它可以与BLE设备通信。但这种方式是不可接受的,因为无法保证推送会在准确的时间交付或完全交付。 那么,是否有可能在使用CoreBluetooth的确切时间唤醒应用程序?好的,鉴于您的限制,这是不可能的。你不能在任何时候唤醒一个后台应用程序。唯一远程接近这一点的是,如果BLE外围设备是应用程

是否可以在准确的时间(或延迟一段时间后)唤醒iOS应用程序并与外围设备通信?我的目标是设置一个警报,并在铃响时与外设通信。 我能猜到的唯一解决方案是在那个时候发送一个远程(推送)通知,该通知将唤醒应用程序,然后它可以与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);