Маяк Eddystone для iOS - Проблема с поиском NamespaceID

У меня есть один старый проект в Objective-C. Мне нужно преобразовать его в последний Swift-5. Все работает нормально, кроме обнаружения маяков Eddystone.

Старый код Objective C,

-(NSString *) findNameSpace : (id) beaconInfo {

    ESSBeaconInfo *beacon = beaconInfo;
    ESSBeaconID *Bid = beacon.beaconID;
    NSLog(@"Beacon : %@", beacon);
    NSLog(@"Beacon ID Length : %lu",(unsigned long)Bid.beaconID.length);
    if (Bid.beaconID.length == 16) {
        NSData *d1 = [Bid.beaconID subdataWithRange:NSMakeRange(0, 10)];
        NSLog(@"Sub Data : %@", d1);
        NSString *namespace = [[NSString stringWithFormat:@"%@",d1] stringByReplacingOccurrencesOfString:@"<" withString:@""];
        namespace = [namespace stringByReplacingOccurrencesOfString:@">" withString:@""];
        namespace = [namespace stringByReplacingOccurrencesOfString:@" " withString:@""];
        NSLog(@"namespace : %@", namespace);
        return namespace;
    }

    return @"";
}

Вывод: -

Маяк: Eddystone, id: ESSBeaconID: beaconID =  введите описание изображения здесь , RSSI: -65, txPower: -31

Длина идентификатора маяка: 16

Дополнительные данные:  введите описание изображения здесь

пространство имен: a457ae5727fa30f48dc9

Мой код Swift

func findNameSpace(_ beaconInfo: Any) -> String? {
        let beacon: ESSBeaconInfo = beaconInfo as! ESSBeaconInfo
        let Bid: ESSBeaconID = beacon.beaconID
        print("Beacon : \(beacon)")
        print("Beacon ID Length : \(Bid.beaconID.count)")
        if Bid.beaconID.count == 16 {
            let d1 = Bid.beaconID.subdata(in: Range(NSRange(location: 0, length: 10))!)
            print("Sub Data : \(d1)")
            var namespace: String? = nil
            namespace = "\(d1)".replacingOccurrences(of: "<", with: "")
            namespace = namespace?.replacingOccurrences(of: ">", with: "")
            namespace = namespace?.replacingOccurrences(of: " ", with: "")
            print("namespace : \(namespace ?? "")")
            return namespace
        }
        return ""
    }

Вывод: -

Маяк: Eddystone, id: ESSBeaconID: beaconID =  введите описание изображения здесь , RSSI: -51, txPower: -31

Длина идентификатора маяка: 16

Дополнительные данные: 10 байт

пространство имен: 10 байт

========================================

У меня проблема с получением пространства имен ... потому что вы можете видеть результат выше. В моем Swift Code данные конвертируются в байты. Я понятия не имею, как с этим справиться. Код Objective C работает отлично. Любая помощь приветствуется! Спасибо.


person iGatiTech    schedule 18.06.2019    source источник
comment
Вот так печатаются Data. Если вы хотите получить более значимый отпечаток в качестве Objective-C, сделайте print(d1 as NSData). Но очевидно, что stringByReplacingOccurrencesOfString: убирать пробелы ‹и› из описания объекта NSData было плохой практикой с самого начала. Вместо этого используйте это: stackoverflow.com/questions/39075043/   -  person Larme    schedule 18.06.2019


Ответы (1)


Это решение, которое сработало в моем случае.

Отправьте ответ здесь, чтобы помочь тем, кто может столкнуться с этой же проблемой. Надеюсь, это будет кому-то полезно!

func findNameSpace(_ beaconInfo: Any) -> String? {
        let beacon: ESSBeaconInfo = beaconInfo as! ESSBeaconInfo
        let Bid: ESSBeaconID = beacon.beaconID
        print("Beacon : \(beacon)")
        print("Beacon ID Length : \(Bid.beaconID.count)")
        if Bid.beaconID.count == 16 {
            let d1 = Bid.beaconID.subdata(in: Range(NSRange(location: 0, length: 10))!)
            print("Sub Data : \(d1)")
            var namespace: String? = nil
            namespace = "\(d1.hexEncodedString())".replacingOccurrences(of: "<", with: "")
            namespace = namespace?.replacingOccurrences(of: ">", with: "")
            namespace = namespace?.replacingOccurrences(of: " ", with: "")
            print("namespace : \(namespace ?? "")")
            return namespace
        }
        return ""
    }

func hexEncodedString(options: HexEncodingOptions = []) -> String {
        let format = options.contains(.upperCase) ? "%02hhX" : "%02hhx"
        return map { String(format: format, $0) }.joined()
    }
person iGatiTech    schedule 11.07.2019