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