Как программно сбросить Bluetooth через Swift - PullRequest
0 голосов
/ 03 октября 2018

У меня есть приложение в Swift 4, которое связывается с другими приложениями, такими как оно, через Bluetooth LE.Он проходит все тесты и работает на «свежем» iPhone.Под «свежим» я подразумеваю, что он был сброшен в последний день и не имел слишком большого количества других взаимодействий с другими классическими устройствами Bluetooth.Я говорю слишком много , потому что я не могу определить это количественно.Некоторые айфоны будут работать сразу после подключения к классическим Bluetooth-устройствам (автомобили, наушники и т. Д.), А другие - нет.Некоторые даже не показывают такого поведения вообще.Исправить это просто: просто перезагрузите iPhone.Это, кажется, происходит на iPhone SE и за его пределами (не может проверить раньше).Однако, это никогда не случается с iPad.

Мой вопрос такой: есть ли способ программно сбросить радиомодуль Bluetooth или стек BLE в iOS? Кажется, я не могу устранить эту проблему,Ничего не отображается в журналах или отладчике.Когда это происходит, устройство просто ожидает подключения Bluetooth, в то время как «свежее» устройство, находящееся рядом с ним, выполнит подключение.Я попытался установить для моего периферийного менеджера значение 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 голосов
/ 19 ноября 2018

К сожалению, нет способа перезагрузить Bluetooth программно.Телефоны iPhone очень сильно кешируют данные Bluetooth для сохранения заряда батареи, поэтому, если произойдет изменение в услугах или характеристиках, которые предлагало устройство BLE, телефон не поднимет их, пока вы не перезапустите Bluetooth или даже руководство по эксплуатации телефона.Я надеюсь, что Apple даст разработчикам больше контроля в будущем.

...