我实际上是在iOS上使用Swift3编写蓝牙低功耗应用程序 我的应用程序在使用CoreBluetooth处于前台(扫描,连接,交换数据......)时运行良好,而我希望它在后台工作(第一步是在后台扫描外围设备)。
我读到了这个主题所以我已经为BLE添加了背景模式(我添加了所有背景模式,所以问题不存在)。
因此,在我的代码中,当我输入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")
}
答案 0 :(得分:0)
请参阅iPhoneAppProgrammingGuide的“背景执行”部分。简而言之,您的应用必须是以下类型之一:
并且您必须按如下所示添加到Info.plist:将UIBackgroundModes键添加到Info.plist文件,并将其值设置为包含以下一个或多个字符串的数组:
位置-即使应用程序在后台运行,该应用程序仍可让用户知道其位置。
voip-该应用程序为用户提供了使用Internet连接拨打电话的功能。
书报摊内容-该应用程序是书报摊应用程序,可在后台下载和处理杂志或报纸的内容。
外部附件-该应用程序与硬件附件一起使用,该附件需要通过外部附件框架定期提供更新。
请注意,审核过程的一部分将进行检查,以确保您的应用执行了其在后台处理方面所做的工作。