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