У меня есть приложение в 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 )
}
}