如何通过Swift

时间:2018-10-03 18:38:30

标签: ios swift bluetooth bluetooth-lowenergy core-bluetooth

我在Swift 4中有一个应用程序,可以通过Bluetooth LE与其他应用程序进行通信,例如自身。它可以通过所有测试,并且可以在“新” iPhone上运行。我所说的“新鲜”是指它已在最后一天进行了重置,并且与其他经典的蓝牙设备之间没有太多的交互。我说太多,因为我无法真正量化它。连接到经典的蓝牙设备(汽车,耳机等)后,某些iPhone可立即工作,而其他iPhone无法。有些甚至根本没有表现出这种行为。修复很容易:只需重启iPhone。这似乎发生在iPhone SE及更高版本上(无法更早测试)。但是,iPad永远不会发生这种情况。

我的问题是:是否可以通过编程方式重置iOS中的蓝牙无线电或BLE堆栈?我似乎无法解决此问题。日志或调试器中未显示任何内容。发生这种情况时,设备仅等待进行蓝牙连接,而旁边的“新鲜”设备将建立连接。我尝试将我的外围设备管理器设置为 nil 来重置它,但是不走运。我还尝试将UUID暂时设置为其他内容,再次没有运气。

有什么想法吗?

// BLE Constructor
override init() {

    // Super
    super.init()

    // Initialize Location Manager
    globalLocationManager.delegate = self
    globalLocationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
    globalLocationManager.requestAlwaysAuthorization()

    // Start Updating Location
    globalLocationManager.startUpdatingLocation()

    // Log
    AppDelegate.log( "Initializing Bluetooth LE Peripheral Manager" )

    // Initialize Peripheral Manager
    let options: Dictionary<String, AnyObject> = [ CBPeripheralManagerOptionShowPowerAlertKey: true as AnyObject ]
    peripheralManager = CBPeripheralManager( delegate: self, queue: nil, options: options )            // nil Queue == Main Queue

    // Initialize Packet Counters
    counter = 0
}

// Start Advertising
func startAdvertising() {

    // Evaluate Advertising State
    if peripheralManager.isAdvertising == false {

        // Start Advertising
        AppDelegate.log( "Starting Advertisements" )

        // Reset Simulation
        resetSimulation()         

        let advertisementData = [
            CBAdvertisementDataLocalNameKey: "TEST" as AnyObject,
            CBAdvertisementDataServiceUUIDsKey: [cbUUID]
        ] as [String : AnyObject]

        peripheralManager.startAdvertising( advertisementData )
    }
}

1 个答案:

答案 0 :(得分:0)

不幸的是,无法以编程方式重新启动蓝牙。 iPhone非常忙于缓存蓝牙数据以保存电池,因此,如果BLE设备提供的服务或功能发生变化,除非重新启动蓝牙甚至电话手册,否则手机将不会接听它们。我希望苹果将来会给开发人员更多的控制权。