iOS 蓝牙崩溃错误Data <> does not represent a valid UUID

在与蓝牙设备交互的过程中发生这种错误,在iOS10的设备上出现崩溃的次数尤其多。

造成问题的原因

之所以会发生崩溃是因为系统用一个NSData数组里的每一个NSData来初始化一个CBUUID,这个数组是如何产生的暂不知道,但是这里面会存在一些格式有问题的NSData对象(字节数不为2、4、16,CBUUID初始化方法明确要求传入的NSData对象的字节数为2或4或16),
image.png

用有问题的NSData去初始化CBUUID的时候就发生崩溃了。

解决方案

通过MethodSwizing改变·+ (CBUUID *)UUIDWithData:(NSData *)theData;方法的实现,在传入的NSData对象格式不符合要求时直接返回一个空对象即可,代码如下。

#import "CBUUID+Extension.h"
#import 

@implementation CBUUID (Extension)

+ (void)load{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        {
            Method method1 = class_getClassMethod([self class], @selector(UUIDWithData:));
            Method method2 = class_getClassMethod([self class], @selector(sy_UUIDWithData:));
            method_exchangeImplementations(method1, method2);
        }
    });
}

+ (CBUUID *)sy_UUIDWithData:(NSData *)theData{
    if (theData.length == 2 || theData.length == 4 || theData.length == 16) {
        return [self sy_UUIDWithData:theData];
    }
    NSLog(@"这是一个不合法的UUID格式");
    return nil;
}

你可能感兴趣的:(iOS 蓝牙崩溃错误Data <> does not represent a valid UUID)