Wie kann ich mein Geräte-Token (NSData) in einen NSString konvertieren?

157

Ich implementiere Push-Benachrichtigungen. Ich möchte mein APNS-Token als Zeichenfolge speichern.

- (void)application:(UIApplication *)application
didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)newDeviceToken
{
    NSString *tokenString = [NSString stringWithUTF8String:[newDeviceToken bytes]]; //[[NSString alloc]initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
    NSLog(@"%@", tokenString);
    NSLog(@"%@", newDeviceToken);
}

Die erste Codezeile gibt null aus. Der zweite druckt den Token. Wie kann ich mein newDeviceToken als NSString erhalten?

Sheehan Alam
quelle
Was ist die Ausgabe der Sekunde NSLog, die druckt newDeviceToken?
Rob Mayoff
benutze KEINE Beschreibung
Fattie

Antworten:

40

benutze das :

NSString * deviceTokenString = [[[[deviceToken description]
                         stringByReplacingOccurrencesOfString: @"<" withString: @""] 
                        stringByReplacingOccurrencesOfString: @">" withString: @""] 
                       stringByReplacingOccurrencesOfString: @" " withString: @""];

NSLog(@"The generated device token string is : %@",deviceTokenString);
kulss
quelle
134
Es scheint eine schlechte Idee zu sein, Beschreibung zu verwenden: Nichts stellt sicher, dass eine spätere Version von iOS die Implementierung und das Ergebnis dieses Aufrufs nicht ändert.
Madewulf
16
In der Tat ist dies eine wirklich schlechte Idee.
David Snabel-Caunt
20
@ Madewulf sehr nett von Ihnen, darauf hinzuweisen, wie schrecklich es ist, eine Beschreibung zu verwenden. Es wäre noch schöner gewesen, wenn Sie eine Alternative vorgeschlagen hätten
Abbood
6
Die Lösung hier unter mit [deviceToken Bytes] passt zur Rechnung.
Madewulf
37
Ab Swift 3 / iOS 10 gibt die Beschreibung auf einem Gerätetoken "32 Byte" zurück. Also ja, benutze das nicht.
Victor Luft
231

Wenn jemand nach einer Möglichkeit sucht, dies in Swift zu tun:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes)
    var tokenString = ""

    for i in 0..<deviceToken.length {
        tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]])
    }

    print("tokenString: \(tokenString)")
}

Bearbeiten: Für Swift 3

Swift 3 führt den DataTyp mit Wertsemantik ein. Um das deviceTokenin einen String zu konvertieren , haben Sie folgende Möglichkeiten:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
    print(token)
}
Sascha
quelle
118
Warum muss das so kompliziert sein, was ist falsch daran, dass das Betriebssystem uns einen String gibt, da dies jeder braucht? Vielen Dank für diese Lösung.
Piwaf
3
@Sascha Ich hoffe, Sie stimmen meiner Bearbeitung Ihrer sehr nützlichen Antwort zu :)
jrturton
16
Ich let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined() überarbeitete
Mono
2
Ich empfehle nicht, .description zu verwenden, da dies nicht garantiert stabil ist. Schauen Sie sich meine Antwort hier an: stackoverflow.com/questions/9372815/…
Swift Taylor
7
Können Sie erklären, was zu "%02.2hhxtun ist?
Honig
155

Jemand hat mir dabei geholfen. Ich gehe nur weiter

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken {

    const unsigned *tokenBytes = [deviceToken bytes];
    NSString *hexToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                         ntohl(tokenBytes[0]), ntohl(tokenBytes[1]), ntohl(tokenBytes[2]),
                         ntohl(tokenBytes[3]), ntohl(tokenBytes[4]), ntohl(tokenBytes[5]),
                         ntohl(tokenBytes[6]), ntohl(tokenBytes[7])];

    [[MyModel sharedModel] setApnsToken:hexToken];
}
Shubhank
quelle
5
Dies ist die beste Lösung, da Encondig-Bytes als Hex implizieren, dass Sie es zählen können;)
Loretoparisi
4
Auf XCode 5 musste ich das deviceToken umwandeln, damit es kompiliert werden konnte: const unsigned * tokenBytes = (const unsigned *) [deviceToken bytes];
Ponytech
3
Tokens werden bald größer als 32 Bytes sein, daher muss dies eine Schleife über jedes Byte sein, anstatt acht fest codierte Ganzzahlen.
Tom Dalling
5
Wäre das eine bessere Lösung? const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Harro
9
Important: APNs device tokens are of variable length. Do not hard-code their size.Apple sagt.
erkanyildiz
141

Sie könnten dies verwenden

- (NSString *)stringWithDeviceToken:(NSData *)deviceToken {
    const char *data = [deviceToken bytes];
    NSMutableString *token = [NSMutableString string];

    for (NSUInteger i = 0; i < [deviceToken length]; i++) {
        [token appendFormat:@"%02.2hhX", data[i]];
    }

    return [token copy];
}
Vlad Polyanskiy
quelle
11
Dies sollte die akzeptierte Antwort sein, da sie viel sicherer ist als die Verwendung description.
DrMickeyLauer
8
Dies ist die einzig richtige Antwort in Objective-C, die die bevorstehende Erhöhung der Tokengröße bewältigt.
Tom Dalling
Einverstanden, dass dies wahrscheinlich der sicherste Weg ist, da keine bestimmte Tokengröße / -länge angenommen wird.
Ryan H.
Funktioniert in iOS 10.
Tjalsma
2
Ich habe [token appendFormat:@"%02.2hhx", data[i]];als Amazon SNS verwendet, erfordert Kleinbuchstaben.
Manuel Schmitzberger
43

Für diejenigen, die in Swift 3 und einfachste Methode wollen

func extractTokenFromData(deviceToken:Data) -> String {
    let token = deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
    return token.uppercased();
}
Anand
quelle
1
Ich habe den gleichen Code geschrieben :) Dies ist die schnellste Version, und nur das funktioniert
Quver
1
@ Anand können Sie bitte erklären, was in diesem Code passiertdeviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Ramakrishna
1
Es verwendet die Reduktionsfunktion von Swift, die Daten in hexadezimale Zeichenfolgen und dann in Zeichenfolgen serialisiert. Um mehr über die Funktion zum Reduzieren zu erfahren,
Anand
15

Erklärung %02.2hhxin der Antwort mit hoher Stimme :

  • %: Führt den xKonvertierungsspezifizierer ein.
  • 02: Die Mindestbreite des konvertierten Werts beträgt 2. Wenn der konvertierte Wert weniger Bytes als die Feldbreite hat, wird er 0links aufgefüllt .
  • .2: Gibt die Mindestanzahl von Stellen an, die für das angezeigt werden sollen x Konvertierungsspezifizierer angezeigt werden sollen.
  • hh: Gibt an, dass die x Konvertierungsspezifizierer für ein vorzeichenbehaftetes Zeichen oder ein vorzeichenloses Zeichenargument gilt (das Argument wurde gemäß den ganzzahligen Heraufstufungen heraufgestuft, sein Wert wird jedoch vor dem Drucken in vorzeichenbehaftetes Zeichen oder vorzeichenloses Zeichen konvertiert).
  • x: Das vorzeichenlose Argument wird im Stil "dddd" in ein vorzeichenloses Hexadezimalformat konvertiert. Die Buchstaben "abcdef" werden verwendet. Die Genauigkeit gibt die Mindestanzahl der anzuzeigenden Stellen an. Wenn der konvertierte Wert in weniger Ziffern dargestellt werden kann, wird er mit führenden Nullen erweitert. Die Standardgenauigkeit ist 1. Das Ergebnis der Konvertierung von Null mit einer expliziten Genauigkeit von Null darf keine Zeichen sein.

Weitere Informationen finden Sie in der IEEE-Druckspezifikation .


Aufgrund der obigen Erklärung denke ich, dass es besser ist, %02.2hhxzu %02xoder zu wechseln%.2x .

Für Swift 5 sind alle folgenden Methoden möglich:

deviceToken.map({String(format: "%02x", $0)}).joined()
deviceToken.map({String(format: "%.2x", $0)}).joined()
deviceToken.reduce("", {$0 + String(format: "%02x", $1)})
deviceToken.reduce("", {$0 + String(format: "%.2x", $1)})

Der Test ist wie folgt:

let deviceToken = (0..<32).reduce(Data(), {$0 + [$1]})
print(deviceToken.reduce("", {$0 + String(format: "%.2x", $1)}))
// Print content:
// 000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
jqgsninimo
quelle
Vielen Dank für diese Antwort. Funktioniert das auch mit iOS 12? Oder hängt es nur von der Swift-Version ab?
Markus
1
@ Markus Dies funktioniert in iOS 12, hängt nur von der Swift-Version ab.
jqgsninimo
14

Es ist meine Lösung und funktioniert gut in meiner App:

    NSString* newToken = [[[NSString stringWithFormat:@"%@",deviceToken] 
stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]] stringByReplacingOccurrencesOfString:@" " withString:@""];
  • convert NSDatazu NSStringmitstringWithFormat
  • Trimmen Sie das "<>"
  • Entfernen Sie die Leerzeichen
Zeb
quelle
10
Dies ruft nur implizit auf -description, ist also nicht sicherer als die akzeptierte Antwort.
Jszumski
Können Sie bitte Ihre Quelle verlinken? Ich kann nirgendwo Informationen darüber finden. Vielen Dank.
Zeb
Fand es! Ich denke, dass es ein bisschen anders ist. Die direkte Verwendung des Beschreibungsattributs ist nicht sicher, da es sich in zukünftigen Versionen ändern kann. Wenn Sie es jedoch über eine NSString-Methode verwenden, treten kaum Probleme auf.
Zeb
5
Nein, das ruft wirklich descriptiondeviceToken auf, wie jszumski sagt.
Jonny
1
@Zeb Es ist nicht sicher, sich darauf zu verlassen, descriptionob Sie es direkt aufrufen oder über eine andere Methode verwenden, da das Format der zurückgegebenen Zeichenfolge jederzeit geändert werden kann. Die richtige Lösung ist hier: stackoverflow.com/a/16411517/108105
Tom Dalling
10

Ich denke, das Konvertieren von deviceToken in eine Hex-Byte-Zeichenfolge hat keinen Sinn. Warum? Sie senden es an Ihr Backend, wo es in Bytes umgewandelt wird, um an APNS gesendet zu werden. Verwenden Sie also die Methode von NSDatabase64EncodedStringWithOptions , übertragen Sie sie auf den Server und verwenden Sie dann umgekehrte base64decodierte Daten :) Das ist so viel einfacher :)

NSString *tokenString = [tokenData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
Oleg Shanyuk
quelle
@ jeet.chanchawat Bitte fügen Sie den Antworten anderer Benutzer keinen Code hinzu. Wir möchten ihnen keine Worte in den Mund nehmen, insbesondere wenn Sie Swift zu einer Objective-C-Antwort hinzufügen. Fügen Sie stattdessen Ihre eigene Antwort hinzu.
JAL
2
Ich wollte die Antwort von @Oleg Shanyuk einfach nicht plagiieren. Da es sich nur um die Übersetzung in eine andere Sprache handelt, die auf seiner Antwort basiert, verdient er die zukünftigen Stimmen. Wenn ich eine andere Antwort hinzufüge, erhalte ich positive Stimmen für die Antwort, bei der es sich um eine Recherche eines anderen handelt. Hoffe das rechtfertigt die EDIT.
jeet.chanchawat
10

In iOS 13 descriptionwird kaputt gehen, also benutze dies

let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()

Lassen Sie uns dies der Klarheit halber aufschlüsseln und jeden Teil erklären:

Die Kartenmethode bearbeitet jedes Element einer Sequenz. Da Daten in Swift eine Folge von Bytes sind, wird der übergebene Abschluss für jedes Byte in deviceToken ausgewertet. Der String (Format :) -Initialisierer wertet jedes Byte in den Daten (dargestellt durch den anonymen Parameter $ 0) unter Verwendung des Formatbezeichners% 02x aus, um eine mit Nullen aufgefüllte, zweistellige hexadezimale Darstellung der Byte / 8-Bit-Ganzzahl zu erzeugen. Nach dem Sammeln jeder von der Map-Methode erstellten Bytedarstellung verkettet join () jedes Element zu einer einzelnen Zeichenfolge.

PS Beschreibung nicht verwenden gibt unterschiedliche Zeichenfolgen in iOS 12 und iOS 13 und nicht sicher für zukünftige Umfang. Entwickler sollten sich bei der Beschreibung eines Objekts nicht auf ein bestimmtes Format verlassen haben.

// iOS 12
(deviceToken as NSData).description // "<965b251c 6cb1926d e3cb366f dfb16ddd e6b9086a 8a3cac9e 5f857679 376eab7C>"

// iOS 13
(deviceToken as NSData).description // "{length = 32, bytes = 0x965b251c 6cb1926d e3cb366f dfb16ddd ... 5f857679 376eab7c }"

Weitere Informationen finden Sie unter Dies .

SuryaKantSharma
quelle
10

In iOS 13 hat die Beschreibung ein anderes Format. Verwenden Sie bitte den folgenden Code, um das Geräte-Token abzurufen.

- (NSString *)fetchDeviceToken:(NSData *)deviceToken {
    NSUInteger len = deviceToken.length;
    if (len == 0) {
        return nil;
    }
    const unsigned char *buffer = deviceToken.bytes;
    NSMutableString *hexString  = [NSMutableString stringWithCapacity:(len * 2)];
    for (int i = 0; i < len; ++i) {
        [hexString appendFormat:@"%02x", buffer[i]];
    }
    return [hexString copy];
}
Vishnu Prakash
quelle
Perfekte Lösung für ios 13. Danke Vishnu
Manish
1
Es wird derzeit nicht kompiliert - lengthin der for-Schleife sollte auf geändert werden len. Anscheinend eine zu kleine Änderung für mich, um sie zu bearbeiten. Aber sonst funktioniert sie perfekt!
Anders Friis
Sie sind ein Lebensretter
Moeez Akram
3

Dies ist eine etwas kürzere Lösung:

NSData *token = // ...
const uint64_t *tokenBytes = token.bytes;
NSString *hex = [NSString stringWithFormat:@"%016llx%016llx%016llx%016llx",
                 ntohll(tokenBytes[0]), ntohll(tokenBytes[1]),
                 ntohll(tokenBytes[2]), ntohll(tokenBytes[3])];
k06a
quelle
3

Funktionale Swift-Version

Einzeiler:

let hexString = UnsafeBufferPointer<UInt8>(start: UnsafePointer(data.bytes),
count: data.length).map { String(format: "%02x", $0) }.joinWithSeparator("")

Hier ist eine wiederverwendbare und selbstdokumentierende Erweiterungsform:

extension NSData {
    func base16EncodedString(uppercase uppercase: Bool = false) -> String {
        let buffer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(self.bytes),
                                                count: self.length)
        let hexFormat = uppercase ? "X" : "x"
        let formatString = "%02\(hexFormat)"
        let bytesAsHexStrings = buffer.map {
            String(format: formatString, $0)
        }
        return bytesAsHexStrings.joinWithSeparator("")
    }
}

Alternativ können Sie verwenden, reduce("", combine: +)anstatt joinWithSeparator("")von Ihren Kollegen als funktionaler Master angesehen zu werden.


Bearbeiten: Ich habe String ($ 0, Radix: 16) in String (Format: "% 02x", $ 0) geändert, da einstellige Zahlen eine Auffüll-Null benötigen

(Ich weiß noch nicht, wie ich eine Frage als Duplikat dieser anderen Frage markieren soll , also habe ich meine Antwort einfach erneut gepostet.)

NiñoScript
quelle
Funktioniert für mich, danke.
Hasya
3

2020

Token als Text ...

let tat = deviceToken.map{ data in String(format: "%02.2hhx", data) }.joined()

oder wenn Sie es vorziehen

let tat2 = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()

(Ergebnis ist das gleiche)

Fattie
quelle
2

Ich warf meine Antwort auf den Stapel. Vermeiden Sie das Parsen von Zeichenfolgen. Die Dokumente garantieren nicht, dass NSData.description immer so funktioniert.

Swift 3-Implementierung:

extension Data {
    func hexString() -> String {
        var bytesPointer: UnsafeBufferPointer<UInt8> = UnsafeBufferPointer(start: nil, count: 0)
        self.withUnsafeBytes { (bytes) in
            bytesPointer = UnsafeBufferPointer<UInt8>(start: UnsafePointer(bytes), count:self.count)
        }
        let hexBytes = bytesPointer.map { return String(format: "%02hhx", $0) }
        return hexBytes.joined()
    }
}
schnelle Taylor
quelle
1

Ich habe versucht, zwei verschiedene Methoden mit Format "%02.2hhx"und zu testen"%02x"

    var i :Int = 0
    var j: Int = 0
    let e: Int = Int(1e4)
    let time = NSDate.timeIntervalSinceReferenceDate
    while i < e {
        _ =  deviceToken.map { String(format: "%02x", $0) }.joined()
        i += 1
    }
    let time2 = NSDate.timeIntervalSinceReferenceDate
    let delta = time2-time
    print(delta)

    let time3 = NSDate.timeIntervalSinceReferenceDate
    while j < e {
        _ =  deviceToken.reduce("", {$0 + String(format: "%02x", $1)})
        j += 1
    }
    let time4 = NSDate.timeIntervalSinceReferenceDate
    let delta2 = time4-time3
    print(delta2)

und das Ergebnis ist, dass der schnellste "%02x"im Durchschnitt 2,0 gegenüber 2,6 für die reduzierte Version ist:

deviceToken.reduce("", {$0 + String(format: "%02x", $1)})
Nicolas Manzini
quelle
1

Die Verwendung von updateAccumulatingResult ist effizienter als die verschiedenen anderen hier beschriebenen Ansätze. Hier ist die schnellste Möglichkeit, Ihre DataBytes zu stringifizieren :

func application(_ application: UIApplication,
                 didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    let token = deviceToken.reduce(into: "") { $0 += String(format: "%.2x", $1) }
    print(token)
}
Alex Curylo
quelle
Alex, wäre es nicht% 02.2hhx
Fattie
0

Für Swift:

var characterSet: NSCharacterSet = NSCharacterSet( charactersInString: "<>" )
    var deviceTokenString: String = ( deviceToken.description as NSString )
    .stringByTrimmingCharactersInSet( characterSet )
    .stringByReplacingOccurrencesOfString( " ", withString: "" ) as String

println( deviceTokenString )
Adarsh ​​GJ
quelle
0

Was ist mit einer einzeiligen Lösung?

Ziel c

NSString *token = [[data.description componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet]invertedSet]]componentsJoinedByString:@""];

Schnell

let token = data.description.componentsSeparatedByCharactersInSet(NSCharacterSet.alphanumericCharacterSet().invertedSet).joinWithSeparator("")
Nikolay Shubenkov
quelle
2
Dies ist die einfache und beste Lösung. Danke
Emmy
0

So geht's in Xamarin.iOS

public override void RegisteredForRemoteNotifications(UIApplication application, NSData deviceToken)
{
    var tokenStringBase64 = deviceToken.GetBase64EncodedString(NSDataBase64EncodingOptions.None);
    //now you can store it for later use in local storage
}
Betrunkener Papa
quelle
-1
NSString *tokenString = [[newDeviceToken description] stringByReplacingOccurrencesOfString:@"[<> ]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [[newDeviceToken description] length])];
Genja Grishin
quelle
großartige Lösung Ab heute kann es in credentials.token.description.replacingOccurrences (von: "[<>]", mit: "", Optionen: .regularExpression, Bereich: nil) impliziert werden
Frank
-1

Schnell:

let tokenString = deviceToken.description.stringByReplacingOccurrencesOfString("[ <>]", withString: "", options: .RegularExpressionSearch, range: nil)
Tony
quelle
-2
-(NSString *)deviceTokenWithData:(NSData *)data
{
    NSString *deviceToken = [[data description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];
    deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""];
    return deviceToken;
}
Mallikarjuna SB
quelle
-2

Schnell

    // make sure that we have token for the devie on the App
    func application(application: UIApplication
        , didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) {

            var tokenStr = deviceToken.description
            tokenStr = tokenStr.stringByReplacingOccurrencesOfString("<", withString: "", options: [], range: nil)
            tokenStr = tokenStr.stringByReplacingOccurrencesOfString(">", withString: "", options: [], range: nil)
            tokenStr = tokenStr.stringByReplacingOccurrencesOfString(" ", withString: "", options: [], range: nil)



            print("my token is: \(tokenStr)")

    }
Vinod Joshi
quelle
-2

Verwenden Sie ausgezeichnete Kategorie!

// .h Datei

@interface NSData (DeviceToken)

- (NSString *)stringDeviceToken;

@end    

// .m Datei

#import "NSData+DeviceToken.h"

@implementation NSData (DeviceToken)

- (NSString *)stringDeviceToken {
    const unsigned *deviceTokenBytes = [deviceToken bytes];
    NSString *deviceToken = [NSString stringWithFormat:@"%08x%08x%08x%08x%08x%08x%08x%08x",
                     ntohl(deviceTokenBytes[0]), ntohl(deviceTokenBytes[1]), ntohl(deviceTokenBytes[2]),
                     ntohl(deviceTokenBytes[3]), ntohl(deviceTokenBytes[4]), ntohl(deviceTokenBytes[5]),
                     ntohl(deviceTokenBytes[6]), ntohl(deviceTokenBytes[7])];
    return deviceToken;
}

@Ende

// AppDelegate.m

#import "NSData+DeviceToken.h"

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
{
    NSString *token = deviceToken.stringDeviceToken;
}

Funktioniert gut!

LLIAJLbHOu
quelle
Verlassen Sie sich nicht auf die Verwendung von "Beschreibung", da sich das Format in Zukunft ändern könnte. Es dient nur zu Anzeigezwecken.
Michael Peterson
-3

Swift 3:

Wenn jemand nach einer Möglichkeit sucht, Geräte-Token in Swift 3 zu erhalten, verwenden Sie das unten modifizierte Snippet.

    let characterSet: CharacterSet = CharacterSet( charactersIn: "<>" )

    let deviceTokenString: String = (deviceToken.description as NSString)
        .trimmingCharacters(in: characterSet as CharacterSet)
        .replacingOccurrences(of: " ", with: "")
        .uppercased()

    print(deviceTokenString)
Laksh Gandikota
quelle
2
Ich empfehle nicht, .description zu verwenden, da dies nicht garantiert gleich bleibt. Siehe meine Antwort hier: stackoverflow.com/questions/9372815/…
Swift Taylor
-4
var token: String = ""
for i in 0..<deviceToken.count {
    token += String(format: "%02.2hhx", deviceToken[i] as CVarArg)
}

print(token)
Abdul Yasin
quelle
1
Die Verwendung der Beschreibung ist nicht sicher, da nicht garantiert wird, dass in Zukunft dieselben Ergebnisse erzielt werden.
Sahil Kapoor
-4

Die hier veröffentlichte Lösung @kulss funktioniert zwar nicht elegant, hat aber die Einfachheit, funktioniert in iOS 13 nicht mehr, da descriptionsie für NSData anders funktioniert. Sie können jedoch weiterhin verwenden debugDescription.

NSString * deviceTokenString = [[[[deviceToken debugDescription]
                     stringByReplacingOccurrencesOfString: @"<" withString: @""] 
                    stringByReplacingOccurrencesOfString: @">" withString: @""] 
                   stringByReplacingOccurrencesOfString: @" " withString: @""];
Johnyu
quelle
-7

Versuchen Sie dies, es sei denn, die Daten sind nullterminiert.

NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];

Naveed Ahmad
quelle
Ich habe es versucht, es funktioniert nicht. Ich habe es in meinem Code-Snippet auskommentiert.
Sheehan Alam
@ SheehanAlam Dieser Typ hat es geschafft. Schauen Sie sich an, wie es in einen String konvertiert wird. stackoverflow.com/questions/4994302/…
Naveed Ahmad
-9
NSString *tokenstring = [[NSString alloc] initWithData:token encoding:NSUTF8StringEncoding];
Ravikant
quelle
Dies funktioniert, wenn die Daten eine Zeichenfolge sind, das deviceToken jedoch keine Zeichenfolge ist.
Simon Epskamp