ios - 仍连接到蓝牙时通过 iBeacon 唤醒 iOS 应用程序

标签 ios objective-c bluetooth bluetooth-lowenergy ibeacon

我已经问过这个问题几次(herehere),但没有可用的回答,所以我现在将以不同的方式问这个问题...

我需要什么

我需要能够将我的应用程序从终止状态唤醒,从我自己编程的蓝牙外围设备发送和接收一些数据。出于安全原因,这是重要的数据,因此我绝对需要唤醒该应用程序。但是,设备在大多数情况下并不总是处于关闭状态,因此我需要在外围设备打开/关闭时处理这个用例。为此,我需要使用 iBeacon 唤醒应用程序,向盒子发送命令,获得响应,然后进入连续交换模式。如果外围设备关闭,我不在乎,只是当它重新打开时,我需要重新启动连续数据交换的过程。

问题

我已经尝试了所有建议的后台“app wakable”info.plist 项目... Voip、背景音频、iBeacon 和蓝牙 didConnectPeripheral/didDisconnect 委托(delegate)方法,但什么也没有确实非常可靠。几天来,当我插入/拔出设备时,我会触发 iBeacon didEnterRegiondidExitRegion 方法,所以至少有一些可靠的东西。

如果我使用 iBeacon 唤醒应用程序并连接到蓝牙,真正的问题就开始了(因为在 iOS 系统级别连接/配对之前我无法与盒子交换信息)。由于该应用程序尚未配对,因此后台中的任何命令都不会进入该框。当此过程在后台启动时,不会出现任何消​​息询问您是否要与此设备配对(当应用程序运行且您可以配对时,一切正常)。

此外,即使我确实有机会配对,那么我现在将永久连接/配对(我不希望用户每次插入设备并且应用程序时都必须按“配对”)关闭)。除非用户进入蓝牙设置并“忘记设备”,否则我无法断开它们的连接。因此,一旦应用程序关闭,我就失去了使用 iBeacon 唤醒应用程序的能力,因为现在只要应用程序通过蓝牙连接,iBeacon 就永远不会触发。

我的问题

其他应用程序如何如此轻松地执行此操作?将您的应用程序从后台永久唤醒/终止的正确流程是什么?我正在努力弄清楚这里的流程。

我真的希望只在不需要连接或配对的用例中使用 iBeacon 吗?我是否应该以某种方式断开用户与外围设备的连接?

求和

总而言之,如果您需要连接/配对到外围设备,则使用 iBeacon 唤醒应用程序将不起作用,因为这些方法将永远不会再次触发,直到不再配对/连接为止。如果我想找到一些神奇的方法来在应用程序终止时断开连接并恢复到 iBeacon,那么它是行不通的,因为我似乎无法从后台进行配对,因此命令无法发送到外围设备。最后,如果我使用纯粹连接的蓝牙方法,则当我插入/拔出设备时,didConnectdidDisconnect 方法永远不会触发。

最佳答案

一些想法:

  1. 是的,BLE 外围设备通常会在连接后停止广播。在此状态下,如果 BLE 外设不再通告信标,您将无法获得 iBeacon 应用程序唤醒。

    • 虽然这种行为很典型,但并不是绝对规则。可以构建在连接时保持广告的外围设备,尽管您使用的芯片组可能存在限制。

    • 防止永久连接的一种常见方法是构建外围代码,如果在 X 秒或分钟内没有与手机进行任何通信,该代码将自动断开连接。这将使信标重新开始。

  2. 蓝牙配对和 BLE 连接的工作方式不同。您可以在后台建立 BLE 连接,无需用户交互。 BLE 连接(不是配对)通常是这样做的,以使其自动进行。可以在后台静默建立与 GATT 服务的连接,并在 plist 中使用以下后台模式交换数据(不需要特殊的 App Store 证明):

    <key>UIBackgroundModes</key>
    <array>
        <string>bluetooth-central</string>
    </array>
    
  3. 如果您确实想要与用户交互配对,则需要执行以下步骤:

    • 当在后台检测到信标时,向用户发送本地通知,告诉他们启动应用程序进行配对。 (调整语言以匹配您的用例。)
    • 当用户点击通知时,应用程序将转到前台。检测到这一点并开始配对过程。

关于ios - 仍连接到蓝牙时通过 iBeacon 唤醒 iOS 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45569846/

相关文章:

objective-c - 相同的命令,不同的结果 setFrame : NSView

ios - iPhone 通过蓝牙发送短信

android - 如何使用广播接收器检测蓝牙状态变化?

ios - NSDictionary 长度计数错误

ios - 如何裁剪 UIScrollView 中显示的 UIImageView 部分并将其保存到 UIImage 变量?

ios - 离开 uiviewcontroller 时 Dropbox 上传停止

ios - 如何为已经构建的 native iOS 应用程序制作一个简单的 3d 对象查看器组件?

ios - 尝试范围信标时出现“CoreBluetooth [API MISUSE] CBCentralManager仅在开机状态下接受命令”错误

iphone - 新iPad是否支持Core Bluetooth,还是仅限于iPhone 4S?

ios - 如何从 UIResponder 中提取更多的触点?