Приложение сбои, когда обратный вызов BLE SDK не выполняется с отсутствующими даннымиIOS

Программируем под IOS
Ответить Пред. темаСлед. тема
Anonymous
 Приложение сбои, когда обратный вызов BLE SDK не выполняется с отсутствующими данными

Сообщение Anonymous »

Проблема
Я интегрирую RunMefit SDK в свое приложение RAGE, используя API Expo Modules для связи с устройством BLE. Когда устройство не отправляет никаких данных (например, пустая история упражнений), мое приложение сбоя с потоком 1: exc_bad_access (code = 1, address = 0x0), потому что обратный вызов в методе SDK NotifyRunmefit никогда не выполняется. class = "Lang-Swift PrettyPrint-Override">// Set up the peripheral delegate
public func centralManager(_ central: CBCentralManager, didConnect peripheral: CBPeripheral) {
print("Connected to \(peripheral.name ?? "unknown device")")
self.peripheral = peripheral
peripheral.delegate = self // Setting the delegate here
peripheral.discoverServices([CBUUID(string: UUID_Service)])
}

// Handling discovered service and characteristics
public func peripheral(_ peripheral: CBPeripheral, didDiscoverServices error: Error?) {
guard let services = peripheral.services else { return }
for service in services {
peripheral.discoverCharacteristics([CBUUID(string: UUID_Write_Char), CBUUID(string: UUID_Notify_Char)], for: service)
}
}

public func peripheral(_ peripheral: CBPeripheral, didDiscoverCharacteristicsFor service: CBService, error: Error?) {
guard let characteristics = service.characteristics else { return }

for characteristic in characteristics {
if characteristic.uuid.uuidString == UUID_Write_Char {
self.writeCharacter = characteristic
} else if characteristic.uuid.uuidString == UUID_Notify_Char {
peripheral.setNotifyValue(true, for: characteristic)
}
}
}

// Problem occurs in this delegate method
public func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {
print("Received: \(String(describing: characteristic.value))")

guard let writeCharacter = writeCharacter else {
print("No write characteristic found")
return
}

let nsError = error as NSError? ?? NSError(domain: "", code: 0, userInfo: nil)

STBlueToothData.sharedInstance().notifyRunmefit(
peripheral,
writeCharacter: writeCharacter,
characteristic: characteristic,
error: nsError,
complete: { (error, revType, errorType, responseObject) in
// This code is never executed when no data is available
// Leading to EXC_BAD_ACCESS crash

let nsError = error as NSError
if nsError.code != 0 {
print("Error: \(error)")
} else {
let dict: [String: Any] = [
ST_RevType_Key: NSNumber(value: revType.rawValue),
ST_ErrorType_Key: NSNumber(value: errorType.rawValue)
]

NotificationCenter.default.post(
name: NSNotification.Name(Nof_Revice_Data_Key),
object: responseObject,
userInfo: dict
)
}
}
)
}
< /code>
SDK Метод Определение < /p>
-(void)notifyRunmefit:(CBPeripheral *)peripheral
WriteCharacter:(CBCharacteristic *)writeCharacter
Characteristic:(CBCharacteristic *)characteristic
Error:(NSError *)error
Complete:(void(^)(NSError *error, REV_TYPE revType, ERROR_TYPE errorType, id responseObject))complete;
< /code>
То, что я наблюдал,
Приложение работает нормально, когда устройство отправляет данные
Когда данные не доступны (например, пустая история упражнений), приложение сбоя с потоком 1: Exc_bad_access (Code = 1, Address = 0x0) < /code>
. Отвечает на то, что не может быть выполнено, что это не так, что не может быть выполнено. Этот сценарий
Что я пробовал: < /p>

Добавление нулевых проверок для почти всего < /li>
Попытка заменить вызов SDK на прямую реализацию < /li>
< /ul>
Вопрос:
Как я могу изменить свою реализацию Swift, чтобы предотвратить аварий, причем призыв к аварийным применению, чтобы не было выполнить призыв к аварию. Есть ли способ реализовать тайм -аут или резервное решение, чтобы справиться с этим изящно? < /P>
* thread #1, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x0)
frame #0: 0x000000019897e1f0 libswiftCore.dylib`swift_getObjectType + 40
frame #1: 0x000000010ab9d420 FitKickLiga.debug.dylib`thunk for @escaping @callee_guaranteed (@guaranteed Error?, @unowned REV_TYPE, @unowned ERROR_TYPE, @in_guaranteed Any) -> () at :0
* frame #2: 0x000000010b7c5478 FitKickLiga.debug.dylib`-[STBlueToothData notifyRunmefit:WriteCharacter:Characteristic:Error:Complete:](self=0x0000000300a2f9c0, _cmd="notifyRunmefit:WriteCharacter:Characteristic:Error:Complete:", peripheral=0x0000000300629ad0, writeCharacter=0x00000003019cde60, characteristic=0x00000003019cdec0, error=domain: "BLEErrorDomain" - code: 0, complete=0x000000010ab9d390) at STBlueToothData.m:325:17
frame #3: 0x000000010ab9c2e4 FitKickLiga.debug.dylib`STBleManager.peripheral(peripheral=0x0000000300629ad0, characteristic=0x00000003019cdec0, error=nil) at STBleManager.swift:328:42
frame #4: 0x000000010ab9d504 FitKickLiga.debug.dylib`@objc STBleManager.peripheral(_:didUpdateValueFor:error:) at :0
frame #5: 0x00000001c2e9fb1c CoreBluetooth`-[CBPeripheral handleAttributeEvent:args:attributeSelector:delegateSelector:delegateFlag:] + 188
frame #6: 0x00000001c2e9fc4c CoreBluetooth`-[CBPeripheral handleCharacteristicEvent:characteristicSelector:delegateSelector:delegateFlag:] + 100
frame #7: 0x00000001c2e9c79c CoreBluetooth`-[CBPeripheral handleMsg:args:] + 632
frame #8: 0x00000001c2e67b08 CoreBluetooth`-[CBCentralManager handleMsg:args:] + 152
frame #9: 0x00000001c2e67a34 CoreBluetooth`-[CBManager xpcConnectionDidReceiveMsg:args:] + 228
frame #10: 0x00000001c2e678e0 CoreBluetooth`__30-[CBXpcConnection _handleMsg:]_block_invoke + 48
frame #11: 0x000000010525088c libdispatch.dylib`_dispatch_call_block_and_release + 32
frame #12: 0x0000000105252578 libdispatch.dylib`_dispatch_client_callout + 20
frame #13: 0x000000010525a454 libdispatch.dylib`_dispatch_lane_serial_drain + 840
frame #14: 0x000000010525b290 libdispatch.dylib`_dispatch_lane_invoke + 460
frame #15: 0x0000000105262cd0 libdispatch.dylib`_dispatch_main_queue_drain + 780
frame #16: 0x00000001052629b4 libdispatch.dylib`_dispatch_main_queue_callback_4CF + 44
frame #17: 0x0000000199fd2bcc CoreFoundation`__CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 16
frame #18: 0x0000000199fcf1c0 CoreFoundation`__CFRunLoopRun + 1996
frame #19: 0x000000019a021284 CoreFoundation`CFRunLoopRunSpecific + 588
frame #20: 0x00000001e728d4c0 GraphicsServices`GSEventRunModal + 164
frame #21: 0x000000019cb6a674 UIKitCore`-[UIApplication _run] + 816
frame #22: 0x000000019c790e88 UIKitCore`UIApplicationMain + 340
frame #23: 0x000000010a1047c0 FitKickLiga.debug.dylib`main(argc=1, argv=0x000000016b6c74a8) at main.m:7:12
frame #24: 0x00000001c0279de8 dyld`start + 2724


Подробнее здесь: https://stackoverflow.com/questions/794 ... ssing-data
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Приложение сбои, когда обратный вызов BLE SDK не выполняется с отсутствующими данными
    Anonymous » » в форуме IOS
    0 Ответы
    12 Просмотры
    Последнее сообщение Anonymous
  • Swift: BLE Peripheral DidupdateValueForCharacteristic обратный вызов, не называемый в SDK
    Anonymous » » в форуме IOS
    0 Ответы
    13 Просмотры
    Последнее сообщение Anonymous
  • Объединение двух таблиц с отсутствующими данными
    Anonymous » » в форуме MySql
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Сравнение 2 файлов данных и создайте новый файл с отсутствующими данными с помощью Python
    Anonymous » » в форуме Python
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • Сравнение 2 файлов данных и создайте новый файл с отсутствующими данными с помощью Python
    Anonymous » » в форуме Python
    0 Ответы
    14 Просмотры
    Последнее сообщение Anonymous

Вернуться в «IOS»