Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何以编程方式处理从iOS设备删除配对的可编程外围设备_Ios_Iphone_Swift_Bluetooth_Core Bluetooth - Fatal编程技术网

如何以编程方式处理从iOS设备删除配对的可编程外围设备

如何以编程方式处理从iOS设备删除配对的可编程外围设备,ios,iphone,swift,bluetooth,core-bluetooth,Ios,Iphone,Swift,Bluetooth,Core Bluetooth,如果iOS应用程序在中央模式下运行,而BLE外设(例如BLE113)具有加密的GATT特征,则当iOS应用程序扫描并连接到外设时,它会在发现加密的GATT特征时自动请求配对 如果iOS设备和BLE外围设备保持配对,一切正常 但是,如果BLE外围设备在内部删除所有绑定信息,而不通知iOS设备正在删除配对密钥,那么如何处理这种情况 iOS CoreBluetooth命令将失败 是否可以通过编程方式解决此问题?重新请求配对,或取消iOS端配对 iOS受蓝牙技术的限制非常有限,所以我看不到什么好的解决方

如果iOS应用程序在中央模式下运行,而BLE外设(例如BLE113)具有加密的GATT特征,则当iOS应用程序扫描并连接到外设时,它会在发现加密的GATT特征时自动请求配对

如果iOS设备和BLE外围设备保持配对,一切正常

但是,如果BLE外围设备在内部删除所有绑定信息,而不通知iOS设备正在删除配对密钥,那么如何处理这种情况

iOS CoreBluetooth命令将失败

是否可以通过编程方式解决此问题?重新请求配对,或取消iOS端配对


iOS受蓝牙技术的限制非常有限,所以我看不到什么好的解决方案,除了检测写入失败的时间,并要求用户手动解绑(这很蹩脚)

我终于解决了这个问题,结果证明,你甚至不需要解绑

我在这里写下了我的经历:

在这里:

基本上,从固件方面,当设备发现配对没有立即发生时,您可以重新请求加密。对于BGScript,以下是相关代码:

event sm_bonding_fail(handle, result) 
# If bonding fails, handle it gracefully based on the following possible results:
# - 0x018B - Out of bonds (no space left, all 8 bonding slots taken)
# - 0x0205 - Authentication failure (shouldn't happen with "just works" mode, but might otherwise)
# - 0x0206 - Pin or key missing (probably local or remote device is missing the key, but not both)
# - 0x0301 - Passkey entry failed (also shouldn't happen in "just works" mode unless bonding is cancelled)
# - 0x0302 - OOB data not available (only occurs if OOB is required and not supported on both ends)
# - 0x0303 - Authentication requirements (I/O capabilities required but not supported)
# - 0x0304 - Confirm value failed (PIN entry/comparison attempted but failed)
# - 0x0305 - Pairing not supported (also occurs if bond info removed from remote device but not local module)
# - 0x0306 - Encryption key size (key size insufficient to meet security requirements)
# - 0x0307 - Command not supported (SMP command is not supported on this device)
# - 0x0308 - Unspecified reason (may occur if bond info is present remotely but not locally)
# - 0x0309 - Repeated attempts (too little time has elapsed since last pairing/security request)
# - 0x030A - Invalid parameters (bad parameters sent during pairing/bonding process)

# NOTE: The most common cases:
# - 0x018B, which means you ran out of space and must remove at least one bond in order to bond again
# - 0x0206, which typically means the pairing info was removed on the remote device but not locally
# - 0x0301, which typically means the user cancelled the pairing request or entered the wrong passkey
# - 0x0305, which is like 0x0206 but is often generated instead if the remote device is a smartphone
# - 0x0308, which typically means the pairing info was removed on the local device but not remotely
if result = $018b then
    # Only solved by removing bonds - requires the user to reset the bonds...
end if

if result = $0301 then
    # Usually solved simply by trying again
    # Seems to solve most problems on iOS
    # On Android, pairing rejected a few times if Android deleted pairing without informing device
    call sm_encrypt_start(0, 1)
end if

if result = $0305 || result = $0206 then
    # Remove local bonding info first, then the remote device needs to reconnect
    # If current_bond_handle is $ff, that means we don't have a bonding handle - so not much we can do
    if current_bond_handle != $ff then
        call sm_delete_bonding(current_bond_handle)
    end if

    # Sometimes takes a few tries
    call connection_disconnect(0)
end if

if result = $0308 then
    # Remove remote bonding info first, then the remote device needs to reconnect
    # Android can recover automatically, iOS cannot
    # Instead of disconnecting, just force a re-encryption... Usually works
    call sm_encrypt_start(0, 1)
end if
end

没错,用户需要在iOS中从蓝牙设置屏幕中删除配对/绑定。应用程序不能做任何事情。@Paulw11 Thannks。是否有相关的文档或示例?此外,CoreBluetooth是否会在某个地方返回任何可能出现这种情况的指示?不幸的是,没有其他解决方案,只有授权用户。我有同样的问题,我找不到任何其他的解决办法@GeekRiky前几天我解决了这个问题,并发布了我的答案