How to turn CBUUID into string

前端 未结 8 1001
太阳男子
太阳男子 2020-12-28 20:11

I can\'t find any official way to get a UUID string back out of a CBUUID. These UUIDs can be 2 or 16 bytes long.

The goal is to store CBUUIDs in a file somewhere as

相关标签:
8条回答
  • 2020-12-28 20:35

    iOS 7.1 (beta released yesterday, 11/18/13) introduced the following property on CBUUID:

    @property(nonatomic, readonly) NSString *UUIDString

    The UUID represented as a string. (read-only)

    From CBUUID Class Reference.

    It's also worth noting that for comparing a UUID string with a CBUUID, this works:

    if ([cbuuidInQuestion isEqual:[CBUUID UUIDWithString:@"1234-5678-9012-1234"]]) {
        // isEqual tests for "the same UUID"
        // == tests for "the same CBUUID object"
    }
    
    0 讨论(0)
  • 2020-12-28 20:41

    There is native method in objective C and Swift and it is quite straight forward method.

    NSString *str = characteristic.UUID.UUIDstring;
    

    Same thing with Swift language Link to library-> https://developer.apple.com/documentation/corebluetooth/cbuuid/1518742-uuidstring?language=objc

    0 讨论(0)
  • 2020-12-28 20:41

    Brad's answer does its work, but the solution could be simpler (though probably not more efficient) using NSUUID class:

    // CBUUID+ToString.h
    
    #import <CoreBluetooth/CoreBluetooth.h>
    
    @interface CBUUID (ToString)
    
    - (NSString *)toString;
    
    @end
    
    // CBUUID+ToString.m
    
    #import "CBUUID+ToString.h"
    
    @implementation CBUUID (ToString)
    
    - (NSString *)toString {
        if ([self respondsToSelector:@selector(UUIDString)]) {
            return [self UUIDString]; // Available since iOS 7.1
        } else {
            return [[[NSUUID alloc] initWithUUIDBytes:[[self data] bytes]] UUIDString]; // iOS 6.0+
        }
    }
    
    @end
    
    0 讨论(0)
  • 2020-12-28 20:44

    To all those saying that CBUUID is toll-free bridged with CFUUIDRef, it's not.

    CBUUID * foo = [CBUUID UUIDWithString:CBUUIDCharacteristicExtendedPropertiesString];
    CFStringRef fooBar = CFUUIDCreateString(NULL, (__bridge CFUUIDRef)foo);
    if (![CBUUIDCharacteristicExtendedPropertiesString isEqualToString:(__bridge NSString *)fooBar])
        NSLog(@"fubar!");
    

    It's not crashing but you're getting garbage out. It's probably uniquely identifying garbage, but it can't be round-tripped.

    PS: This didn't work as a comment because SO comments oddly don't allow code formatting.

    0 讨论(0)
  • 2020-12-28 20:49

    The following Worked me without any error:

    NSString *str = [[NSString alloc] initWithFormat:@"%@",  CFUUIDCreateString(nil, peripheral.UUID) ];
    
    0 讨论(0)
  • 2020-12-28 20:54

    I rigged up the following category to do this for CBUUID:

    @interface CBUUID (StringExtraction)
    
    - (NSString *)representativeString;
    
    @end
    
    @implementation CBUUID (StringExtraction)
    
    - (NSString *)representativeString;
    {
        NSData *data = [self data];
    
        NSUInteger bytesToConvert = [data length];
        const unsigned char *uuidBytes = [data bytes];
        NSMutableString *outputString = [NSMutableString stringWithCapacity:16];
    
        for (NSUInteger currentByteIndex = 0; currentByteIndex < bytesToConvert; currentByteIndex++)
        {
            switch (currentByteIndex)
            {
                case 3:
                case 5:
                case 7:
                case 9:[outputString appendFormat:@"%02x-", uuidBytes[currentByteIndex]]; break;
                default:[outputString appendFormat:@"%02x", uuidBytes[currentByteIndex]];
            }
    
        }
    
        return outputString;
    }
    
    @end
    

    For this input:

    NSLog(@"UUID string: %@", [[CBUUID UUIDWithString:@"0bd51666-e7cb-469b-8e4d-2742f1ba77cc"] representativeString]);
    NSLog(@"UUID string2: %@", [[CBUUID UUIDWithString:@"1800"] representativeString]);
    

    it produces the following output:

    UUID string: 0bd51666-e7cb-469b-8e4d-2742f1ba77cc
    UUID string2: 1800
    

    and preserves the appropriate hyphenation for the 16 byte UUIDs, while supporting the simple 2-byte UUIDs.

    0 讨论(0)
提交回复
热议问题