iOS背景蓝牙低功耗扫描(swift3)

时间:2017-10-13 06:18:46

标签: ios swift3 background bluetooth-lowenergy

我实际上是在iOS上使用Swift3编写蓝牙低功耗应用程序 我的应用程序在使用CoreBluetooth处于前台(扫描,连接,交换数据......)时运行良好,而我希望它在后台工作(第一步是在后台扫描外围设备)。

我读到了这个主题所以我已经为BLE添加了背景模式(我添加了所有背景模式,所以问题不存在)。

Image of my Background Modes

因此,在我的代码中,当我输入applicationDidEnterBackground方法时,我调用了initCBCentralManager方法。这很好用,因为它进入centralManagerDidUpdateState和“上电”状态。 调用我的scan函数,这不是问题所在。

但是,在调用scan方法后,没有任何反应,我从未调用didDiscover peripheral。当我在前台使用这些函数时(通过在applicationWillEnterForeground而不是applicationDidEnterBackground中调用我的函数),它可以正常工作,但不适用于它在后台。

我读到我需要发现一个特定的服务,所以这就是我的工作(我的服务是6E400001-B5A3-F393-E0A9-E50E24DCCA9E,而CBCentralManagerScanOptionAllowDuplicatesKey选项也将被忽略,但如果我将其更改为false,则不再发生的情况。

那么,当我进入后台时,我应该如何扫描蓝牙低功耗外设呢?

这是我的代码:

import CoreBluetooth  

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CBPeripheralDelegate, CBCentralManagerDelegate {

var _manager : CBCentralManager?

func applicationDidEnterBackground(_ application: UIApplication) {
    initCBCentralManager()
}

func initCBCentralManager() {
    var dic : [String : Any] = Dictionary()
    dic[CBCentralManagerOptionShowPowerAlertKey] = false
    _manager = CBCentralManager(delegate: self, queue: nil)
}

public func centralManagerDidUpdateState(_ central: CBCentralManager) {
    switch central.state {
    case .poweredOff:
        print("State : Powered Off")
    case .poweredOn:
        print("State : Powered On")
        scan()
    case .resetting:
        print("State : Resetting")
    case .unauthorized:
        print("State : Unauthorized")
    case .unknown:
        print("State : Unknown")
    case .unsupported:
        print("State : Unsupported")
    }
}

func scan()
{
    print("SCAN")
    let service = "6E400001-B5A3-F393-E0A9-E50E24DCCA9E"
    var service_cbbuid:[CBUUID] = [CBUUID(string: service)]
    _manager?.scanForPeripherals(withServices: service_cbbuid, options: [CBCentralManagerScanOptionAllowDuplicatesKey:true])
}

func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral, advertisementData: [String : Any], rssi RSSI: NSNumber) {
    print("BACKGROUND_SCAN -> \(peripheral.name.unsafelyUnwrapped) \(RSSI)dBm")
}

1 个答案:

答案 0 :(得分:0)

请参阅iPhoneAppProgrammingGuide的“背景执行”部分。简而言之,您的应用必须是以下类型之一:

  1. 在后台播放用户可听内容的应用,例如音乐播放器应用
  2. 始终让用户了解其位置的应用程序,例如导航应用程序
  3. 支持互联网协议语音(VoIP)的应用
  4. 需要下载和处理新内容的书报摊应用程序
  5. 从外部附件中定期接收更新的应用

并且您必须按如下所示添加到Info.plist:将UIBackgroundModes键添加到Info.plist文件,并将其值设置为包含以下一个或多个字符串的数组:

  1. 音频-在后台,该应用可向用户播放可听内容。 (此内容包括使用AirPlay流音频或视频内容。)
  2. 位置-即使应用程序在后台运行,该应用程序仍可让用户知道其位置。

  3. voip-该应用程序为用户提供了使用Internet连接拨打电话的功能。

  4. 书报摊内容-该应用程序是书报摊应用程序,可在后台下载和处理杂志或报纸的内容。

  5. 外部附件-该应用程序与硬件附件一起使用,该附件需要通过外部附件框架定期提供更新。

    1. bluetooth-central-该应用程序与蓝牙附件一起使用,该附件需要通过CoreBluetooth框架定期提供更新

请注意,审核过程的一部分将进行检查,以确保您的应用执行了其在后台处理方面所做的工作。