可以在后台运行并可以连接到设备的IOS应用程序

可以在后台运行并可以连接到设备的IOS应用程序,ios,mobile,ibeacon,Ios,Mobile,Ibeacon,我有一个用例,其中有两个设备。一款是运行IOS应用程序的苹果手机,另一款是支持BLE的物联网设备 IOS应用程序不断扫描附近的BLE设备,如果它发现一个具有特定UUID服务的BLE设备,它将连接到该设备并通过GATT特性发送数据 即使在后台,此IOS应用程序也应连续运行。也就是说,当它在后台时,它应该扫描具有特定服务的BLE设备,如果找到它,它应该在后台连接到它并写入GATT特征 这里的问题是IOS在应用程序处于后台时终止应用程序 唯一的办法是让物联网设备广播IBeacon而不是普通的BLE信标

我有一个用例,其中有两个设备。一款是运行IOS应用程序的苹果手机,另一款是支持BLE的物联网设备

  • IOS应用程序不断扫描附近的BLE设备,如果它发现一个具有特定UUID服务的BLE设备,它将连接到该设备并通过GATT特性发送数据
  • 即使在后台,此IOS应用程序也应连续运行。也就是说,当它在后台时,它应该扫描具有特定服务的BLE设备,如果找到它,它应该在后台连接到它并写入GATT特征
  • 这里的问题是IOS在应用程序处于后台时终止应用程序
  • 唯一的办法是让物联网设备广播IBeacon而不是普通的BLE信标。但如果找到IBeacon,IOS应用程序将在后台被唤醒,但它无法获取发送IBeacon的设备的BLE地址,并且无法连接到它

  • 如何解决这个问题?

    虽然iBeacon在后台检测速度非常快,效果最好,但它不是绝对必要的。您可以在后台检测iOS上的可扩展服务,并在发现时连接到该服务

    为此,您必须:

  • 在您的Info.plist中声明:
  • 如果您执行上述操作,在您的应用程序终止后,iOS将自动启动您的应用程序,当发现新的外围设备时,您将得到一个到
    didiscoverperipal
    的回调

    虽然这确实有效,但由于iOS跟踪重复项的方式,很难正确测试。如果一个设备已经被检测到,并且你杀死了你的应用程序,你将不会得到关于它的发现的回调——iOS会跟踪它已经被检测到。它只会给你一个新设备的启动和回调

    下面是我将如何测试它:

  • 修改您的应用程序,以便在检测到可移动设备时发送本地通知。验证这是否有效
  • 关闭可移动设备
  • 启动你的应用程序
  • 重新启动你的手机
  • 打开可扩展设备
  • 等待上面的通知。耐心点!重新启动手机时,BLE堆栈可能在几分钟内无法完全启动
  • 上面的手机重启步骤对于清除iPhone已经看到的设备的缓存非常关键,因此不符合回调条件


    最后,您可以使用一个BLE设备来加速这一过程,该设备还宣传iBeacon,因为背景检测要快得多,而且不那么喜怒无常。但正如您所注意到的,您不能使用iBeacon通过CoreBooth连接到外围设备。因此,您必须从您的BLE设备上发布这两种产品的广告。这是我一直使用的常用方法。使用iBeacon加速应用程序的唤醒,并检测核心蓝牙服务广告以建立连接。

    在检测到可恢复服务后在后台重新启动应用程序。应用程序是否可以连接到检测到其服务的设备并使用其执行GATT操作?是的,这是蓝牙中央后台模式的要点。如果用户已强制终止应用程序,那么如果BLE设备靠近手机,应用程序是否可以在后台启动?我不是肯定的,但我怀疑答案是否定的。您可以,但是,在此类事件发生后,使用iBeacon监控重新启动您的应用程序。
        <key>UIBackgroundModes</key>
        <array>
            <string>bluetooth-central</string>
        </array>
    
    centralManager?.scanForPeripherals(withServices: [myServiceUUID], options: nil)