在仍连接到蓝牙时通过 iBeacon 唤醒 iOS 应用程序
Wake up iOS application by iBeacon when still connected to Bluetooth
这个问题我已经问过几次 ( and ),但没有可用的回复,所以我现在换个方式问这个问题...
我需要的
我需要能够将我的应用程序从终止状态唤醒,从我自己编程的蓝牙外围设备发送和接收一些数据。出于安全原因,这是重要数据,因此我绝对需要应用程序唤醒。但是,该设备在大多数情况下并不总是处于关闭状态,因此我需要在外围设备打开时处理这个用例 on/off。为此,我需要使用 iBeacon 来唤醒应用程序,向盒子发送命令,获得响应,然后进入连续交换模式。如果外围设备关闭我不在乎,只要它重新打开就是我需要重新启动连续数据交换过程的时候。
问题
我已经尝试了所有建议的背景 "app wakable" info.plist 项...Voip、背景音频、iBeacon 和蓝牙 didConnectPeripheral
/didDisconnect
委托方法,但实际上什么都没有工作非常可靠。几天来,当我 plug/unplug 我的设备时,我已经触发了 iBeacon didEnterRegion
和 didExitRegion
方法,所以至少有一些可靠的东西。
如果我使用 iBeacon 唤醒应用程序并连接到蓝牙,真正的问题就开始了(因为在 iOS 系统级别 connect/pair 之前我无法与盒子交换信息)。由于该应用尚未配对,因此 none 的后台命令会进入方框。当此过程在后台启动时,不会出现任何消息询问您是否要与此设备配对(当应用程序为 运行 并且您可以配对时一切正常)。
此外,即使我确实有机会配对,我现在也会永久 connected/paired(我不希望用户每次插入时都必须按 "pair"设备和应用程序已关闭)。除非用户进入蓝牙设置和 "forgets the device" 然后我不能断开它们。因此,一旦应用程序关闭,我就失去了使用 iBeacon 唤醒应用程序的能力,因为现在只要应用程序通过蓝牙连接,iBeacon 就永远不会触发。
我的问题
其他应用如何如此轻松地执行此操作?将您的应用从 background/terminated 中永久唤醒的正确流程是什么?我正在努力弄清楚这里的流程。
我真的只希望在不需要连接或配对的用例中使用 iBeacon 吗?我应该以某种方式断开用户与外围设备的连接吗?
求和
所以总而言之,如果您需要 connect/pair 到外围设备,使用 iBeacon 唤醒应用程序是行不通的,因为这些方法将永远不会再次触发,直到不再 paired/connected。如果我想找到一些神奇的方法来在应用程序死机时断开与人的连接并恢复到 iBeacon,那是行不通的,因为我似乎无法从后台配对,所以命令不会发送到外围设备。最后,如果我使用纯连接的蓝牙方法,didConnect
和 didDisconnect
方法在我 plug/unplug 设备时永远不会触发。
一些想法:
是的,BLE 外围设备通常会在连接后停止广播。在此状态下,如果 BLE 外设不再通告信标,您将无法获得 iBeacon 应用程序唤醒。
虽然这种行为很典型,但并不是绝对规则。可以构建在连接时保持广告的外围设备,尽管您使用的芯片组可能存在限制。
防止永久连接的一种常见方法是构建外围代码,如果在 X 秒或分钟内没有与移动设备进行任何通信phone,该代码将自动断开连接。这将允许重新开始信标。
蓝牙配对和 BLE 连接的工作方式不同。您可以在后台建立 BLE 连接,无需用户交互。 BLE 连接(不是配对)通常是这样做的,以使其自动进行。可以在后台静默建立与 GATT 服务的连接,并在 plist 中使用以下后台模式交换数据(不需要特殊的 App Store 理由):
<key>UIBackgroundModes</key>
<array>
<string>bluetooth-central</string>
</array>
如果您真的想与用户交互配对,您需要执行以下步骤:
- 当在后台检测到信标时,向用户发送本地通知,告诉他们启动应用程序进行配对。 (调整语言以匹配您的用例。)
- 当用户点击通知时,应用程序将进入前台。检测到这一点并开始配对过程。
这个问题我已经问过几次 (
我需要的
我需要能够将我的应用程序从终止状态唤醒,从我自己编程的蓝牙外围设备发送和接收一些数据。出于安全原因,这是重要数据,因此我绝对需要应用程序唤醒。但是,该设备在大多数情况下并不总是处于关闭状态,因此我需要在外围设备打开时处理这个用例 on/off。为此,我需要使用 iBeacon 来唤醒应用程序,向盒子发送命令,获得响应,然后进入连续交换模式。如果外围设备关闭我不在乎,只要它重新打开就是我需要重新启动连续数据交换过程的时候。
问题
我已经尝试了所有建议的背景 "app wakable" info.plist 项...Voip、背景音频、iBeacon 和蓝牙 didConnectPeripheral
/didDisconnect
委托方法,但实际上什么都没有工作非常可靠。几天来,当我 plug/unplug 我的设备时,我已经触发了 iBeacon didEnterRegion
和 didExitRegion
方法,所以至少有一些可靠的东西。
如果我使用 iBeacon 唤醒应用程序并连接到蓝牙,真正的问题就开始了(因为在 iOS 系统级别 connect/pair 之前我无法与盒子交换信息)。由于该应用尚未配对,因此 none 的后台命令会进入方框。当此过程在后台启动时,不会出现任何消息询问您是否要与此设备配对(当应用程序为 运行 并且您可以配对时一切正常)。
此外,即使我确实有机会配对,我现在也会永久 connected/paired(我不希望用户每次插入时都必须按 "pair"设备和应用程序已关闭)。除非用户进入蓝牙设置和 "forgets the device" 然后我不能断开它们。因此,一旦应用程序关闭,我就失去了使用 iBeacon 唤醒应用程序的能力,因为现在只要应用程序通过蓝牙连接,iBeacon 就永远不会触发。
我的问题
其他应用如何如此轻松地执行此操作?将您的应用从 background/terminated 中永久唤醒的正确流程是什么?我正在努力弄清楚这里的流程。
我真的只希望在不需要连接或配对的用例中使用 iBeacon 吗?我应该以某种方式断开用户与外围设备的连接吗?
求和
所以总而言之,如果您需要 connect/pair 到外围设备,使用 iBeacon 唤醒应用程序是行不通的,因为这些方法将永远不会再次触发,直到不再 paired/connected。如果我想找到一些神奇的方法来在应用程序死机时断开与人的连接并恢复到 iBeacon,那是行不通的,因为我似乎无法从后台配对,所以命令不会发送到外围设备。最后,如果我使用纯连接的蓝牙方法,didConnect
和 didDisconnect
方法在我 plug/unplug 设备时永远不会触发。
一些想法:
是的,BLE 外围设备通常会在连接后停止广播。在此状态下,如果 BLE 外设不再通告信标,您将无法获得 iBeacon 应用程序唤醒。
虽然这种行为很典型,但并不是绝对规则。可以构建在连接时保持广告的外围设备,尽管您使用的芯片组可能存在限制。
防止永久连接的一种常见方法是构建外围代码,如果在 X 秒或分钟内没有与移动设备进行任何通信phone,该代码将自动断开连接。这将允许重新开始信标。
蓝牙配对和 BLE 连接的工作方式不同。您可以在后台建立 BLE 连接,无需用户交互。 BLE 连接(不是配对)通常是这样做的,以使其自动进行。可以在后台静默建立与 GATT 服务的连接,并在 plist 中使用以下后台模式交换数据(不需要特殊的 App Store 理由):
<key>UIBackgroundModes</key> <array> <string>bluetooth-central</string> </array>
如果您真的想与用户交互配对,您需要执行以下步骤:
- 当在后台检测到信标时,向用户发送本地通知,告诉他们启动应用程序进行配对。 (调整语言以匹配您的用例。)
- 当用户点击通知时,应用程序将进入前台。检测到这一点并开始配对过程。