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?
ios
objective-c
apple-push-notifications
nsstring
nsdata
Sheehan Alam
quelle
quelle
NSLog
, die drucktnewDeviceToken
?Antworten:
benutze das :
quelle
Wenn jemand nach einer Möglichkeit sucht, dies in Swift zu tun:
Bearbeiten: Für Swift 3
Swift 3 führt den
Data
Typ mit Wertsemantik ein. Um dasdeviceToken
in einen String zu konvertieren , haben Sie folgende Möglichkeiten:quelle
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
überarbeitete"%02.2hhx
tun ist?Jemand hat mir dabei geholfen. Ich gehe nur weiter
quelle
const unsigned *tokenBytes = [deviceToken bytes]; NSMutableString *hexToken = [NSMutableString string]; for (NSUInteger byteCount = 0; byteCount * 4 < [deviceToken length]; byteCount++) { [hexToken appendFormat:@"%08x", ntohl(tokenBytes[byteCount])]; }
Important: APNs device tokens are of variable length. Do not hard-code their size.
Apple sagt.Sie könnten dies verwenden
quelle
description
.[token appendFormat:@"%02.2hhx", data[i]];
als Amazon SNS verwendet, erfordert Kleinbuchstaben.Für diejenigen, die in Swift 3 und einfachste Methode wollen
quelle
deviceToken.reduce("", {$0 + String(format: "%02X", $1)})
Erklärung
%02.2hhx
in der Antwort mit hoher Stimme :%
: Führt denx
Konvertierungsspezifizierer ein.02
: Die Mindestbreite des konvertierten Werts beträgt 2. Wenn der konvertierte Wert weniger Bytes als die Feldbreite hat, wird er0
links aufgefüllt ..2
: Gibt die Mindestanzahl von Stellen an, die für das angezeigt werden sollenx
Konvertierungsspezifizierer angezeigt werden sollen.hh
: Gibt an, dass diex
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.2hhx
zu%02x
oder zu wechseln%.2x
.Für Swift 5 sind alle folgenden Methoden möglich:
Der Test ist wie folgt:
quelle
Es ist meine Lösung und funktioniert gut in meiner App:
NSData
zuNSString
mitstringWithFormat
quelle
-description
, ist also nicht sicherer als die akzeptierte Antwort.description
deviceToken auf, wie jszumski sagt.description
ob 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/108105Ich 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 NSData
base64EncodedStringWithOptions
, übertragen Sie sie auf den Server und verwenden Sie dann umgekehrte base64decodierte Daten :) Das ist so viel einfacher :)quelle
In iOS 13
description
wird kaputt gehen, also benutze diesLassen 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.
Weitere Informationen finden Sie unter Dies .
quelle
In iOS 13 hat die Beschreibung ein anderes Format. Verwenden Sie bitte den folgenden Code, um das Geräte-Token abzurufen.
quelle
length
in der for-Schleife sollte auf geändert werdenlen
. Anscheinend eine zu kleine Änderung für mich, um sie zu bearbeiten. Aber sonst funktioniert sie perfekt!Dies ist eine etwas kürzere Lösung:
quelle
Funktionale Swift-Version
Einzeiler:
Hier ist eine wiederverwendbare und selbstdokumentierende Erweiterungsform:
Alternativ können Sie verwenden,
reduce("", combine: +)
anstattjoinWithSeparator("")
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.)
quelle
2020
Token als Text ...
oder wenn Sie es vorziehen
(Ergebnis ist das gleiche)
quelle
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:
quelle
Ich habe versucht, zwei verschiedene Methoden mit Format
"%02.2hhx"
und zu testen"%02x"
und das Ergebnis ist, dass der schnellste
"%02x"
im Durchschnitt 2,0 gegenüber 2,6 für die reduzierte Version ist:quelle
Die Verwendung von updateAccumulatingResult ist effizienter als die verschiedenen anderen hier beschriebenen Ansätze. Hier ist die schnellste Möglichkeit, Ihre
Data
Bytes zu stringifizieren :quelle
Für Swift:
quelle
Was ist mit einer einzeiligen Lösung?
Ziel c
Schnell
quelle
So geht's in Xamarin.iOS
quelle
quelle
Schnell:
quelle
quelle
Schnell
quelle
Verwenden Sie ausgezeichnete Kategorie!
// .h Datei
// .m Datei
@Ende
// AppDelegate.m
Funktioniert gut!
quelle
Swift 3:
Wenn jemand nach einer Möglichkeit sucht, Geräte-Token in Swift 3 zu erhalten, verwenden Sie das unten modifizierte Snippet.
quelle
quelle
Die hier veröffentlichte Lösung @kulss funktioniert zwar nicht elegant, hat aber die Einfachheit, funktioniert in iOS 13 nicht mehr, da
description
sie für NSData anders funktioniert. Sie können jedoch weiterhin verwendendebugDescription
.quelle
Versuchen Sie dies, es sei denn, die Daten sind nullterminiert.
NSString* newStr = [[NSString alloc] initWithData:newDeviceToken encoding:NSUTF8StringEncoding];
quelle
quelle