Ich arbeite an Push-Benachrichtigungen. Ich habe den folgenden Code zum Abrufen eines Geräte-Tokens geschrieben.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the view controller's view to the window and display.
[self.window addSubview:viewController.view];
[self.window makeKeyAndVisible];
NSLog(@"Registering for push notifications...");
[[UIApplication sharedApplication] registerForRemoteNotificationTypes:
(UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)];
return YES;
}
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken];
NSLog(@"This is device token%@", deviceToken);
}
- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err {
NSString *str = [NSString stringWithFormat: @"Error: %@", err];
NSLog(@"Error %@",err);
}
Ich kann die Anwendung auf dem Gerät erfolgreich ausführen, aber die Geräte-ID nicht auf der Konsole abrufen.
Ich habe keine Probleme mit Zertifizierungs- und Bereitstellungsprofilen.
Antworten:
HINWEIS: Die folgende Lösung funktioniert nicht mehr auf iOS 13+ Geräten - sie gibt Mülldaten zurück .
Bitte verwenden Sie stattdessen den folgenden Code:
+ (NSString *)hexadecimalStringFromData:(NSData *)data { NSUInteger dataLength = data.length; if (dataLength == 0) { return nil; } const unsigned char *dataBuffer = (const unsigned char *)data.bytes; NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; for (int i = 0; i < dataLength; ++i) { [hexString appendFormat:@"%02x", dataBuffer[i]]; } return [hexString copy]; }
Lösung, die vor iOS 13 funktioniert hat:
Ziel c
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [[deviceToken description] stringByTrimmingCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"<>"]]; token = [token stringByReplacingOccurrencesOfString:@" " withString:@""]; NSLog(@"this will return '32 bytes' in iOS 13+ rather than the token", token); }
Swift 3.0
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("this will return '32 bytes' in iOS 13+ rather than the token \(tokenString)") }
quelle
Um Token - Gerät Sie durch einige tun können Schritte :
1) Aktivieren Sie APNS (Apple Push Notification Service) sowohl für die Entwicklerzertifizierung als auch für die Verteilungszertifizierung und laden Sie diese beiden Dateien erneut herunter.
2) Laden Sie sowohl die Developer Provisioning- als auch die Distribute Provisioning-Datei erneut herunter.
3) In der Xcode-Schnittstelle: Einstellung Provisioning für PROJECT und TARGETS mit zwei File Provisioning haben Download.
4) Schließlich müssen Sie den folgenden Code in die AppDelegate-Datei einfügen, um das Token-Gerät zu erhalten (Hinweis: Führen Sie die App auf einem realen Gerät aus).
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [self.window addSubview:viewController.view]; [self.window makeKeyAndVisible]; NSLog(@"Registering for push notifications..."); [[UIApplication sharedApplication] registerForRemoteNotificationTypes: (UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; return YES; } - (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *str = [NSString stringWithFormat:@"Device Token=%@",deviceToken]; NSLog(@"%@", str); } - (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err { NSString *str = [NSString stringWithFormat: @"Error: %@", err]; NSLog(@"%@",str); }
quelle
Die Verwendung von
description
so vielen dieser Antworten ist der falsche Ansatz - selbst wenn Sie es zum Laufen bringen, wird es in iOS 13+ kaputt gehen.Stattdessen sollten Sie sicherstellen, dass Sie die tatsächlichen Binärdaten verwenden und nicht nur eine Beschreibung. Andrey Gagan hat die Objective C-Lösung recht gut angesprochen, aber zum Glück ist es in Kürze viel einfacher:
Swift 4.2 funktioniert unter iOS 13+
// credit to NSHipster (see link above) // format specifier produces a zero-padded, 2-digit hexadecimal representation let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
quelle
Ziel C für iOS 13+ mit freundlicher Genehmigung von Wasif Saood
Kopieren Sie den folgenden Code und fügen Sie ihn in AppDelegate.m ein, um das APN-Token des Geräts zu drucken.
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSUInteger dataLength = deviceToken.length; if (dataLength == 0) { return; } const unsigned char *dataBuffer = (const unsigned char *)deviceToken.bytes; NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)]; for (int i = 0; i < dataLength; ++i) { [hexString appendFormat:@"%02x", dataBuffer[i]]; } NSLog(@"APN token:%@", hexString); }
quelle
Der folgende Code wird zum Abrufen des Gerätetokens verwendet.
// Prepare the Device Token for Registration (remove spaces and < >) NSString *devToken = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""] stringByReplacingOccurrencesOfString: @" " withString: @""]; NSString *str = [NSString stringWithFormat:@"Device Token=%@",devToken]; UIAlertView *alertCtr = [[[UIAlertView alloc] initWithTitle:@"Token is " message:devToken delegate:self cancelButtonTitle:nil otherButtonTitles: nil] autorelease]; [alertCtr show]; NSLog(@"device token - %@",str);
quelle
description
.Und die Swift-Version der Antwort des Wasif:
Swift 2.x.
var token = deviceToken.description.stringByTrimmingCharactersInSet(NSCharacterSet(charactersInString: "<>")) token = token.stringByReplacingOccurrencesOfString(" ", withString: "") print("Token is \(token)")
Update für Swift 3
let deviceTokenString = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
quelle
description
für Binärdaten verwenden (siehe andere Antwort)Wenn Sie immer noch kein Geräte-Token erhalten, geben Sie den folgenden Code ein, um Ihr Gerät für die Push-Benachrichtigung zu registrieren.
Es wird auch auf ios8 oder mehr funktionieren.
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 80000 if ([UIApplication respondsToSelector:@selector(registerUserNotificationSettings:)]) { UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge|UIUserNotificationTypeAlert|UIUserNotificationTypeSound categories:nil]; [[UIApplication sharedApplication] registerUserNotificationSettings:settings]; [[UIApplication sharedApplication] registerForRemoteNotifications]; } else { [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; } #else [[UIApplication sharedApplication] registerForRemoteNotificationTypes: UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound]; #endif
quelle
Ab iOS 13 hat Apple die
[deviceToken description]
Ausgabe geändert . Jetzt ist es so,{length=32,bytes=0x0b8823aec3460e1724e795cba45d22e8...af8c09f971d0dabc}
was für das Gerätetoken falsch ist.Ich schlage vor, dieses Code-Snippet zu verwenden, um ein Problem zu beheben:
+ (NSString *)stringFromDeviceToken:(NSData *)deviceToken { NSUInteger length = deviceToken.length; if (length == 0) { return nil; } const unsigned char *buffer = deviceToken.bytes; NSMutableString *hexString = [NSMutableString stringWithCapacity:(length * 2)]; for (int i = 0; i < length; ++i) { [hexString appendFormat:@"%02x", buffer[i]]; } return [hexString copy]; }
Es funktioniert für iOS13 und niedriger.
quelle
description
war immer falsch. Dies ist nur eine mögliche Lösung, um das Token in einen String umzuwandeln. Eine viel einfachere Lösung besteht darin, dieNSData
in eineNSString
Standard-Base64-Codierung umzuwandeln .Holen Sie sich das Gerätetoken in Swift 3
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let deviceTokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("Device token: \(deviceTokenString)") }
quelle
In Ihrem AppDelegate in der
didRegisterForRemoteNotificationsWithDeviceToken
Methode:Aktualisiert für Swift:
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })") }
quelle
Swift 4 Das funktioniert bei mir:
Schritt 1 in ZIELE Klicken Sie auf Funktion hinzufügen und wählen Sie Push-Benachrichtigungen
Schritt 2 in AppDelegate.swift fügen Sie den folgenden Code hinzu:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { UNUserNotificationCenter.current().requestAuthorization(options: [.alert,.sound]) { (didAllow, error) in } UIApplication.shared.registerForRemoteNotifications() return true } //Get device token func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenString = deviceToken.reduce("", {$0 + String(format: "%02X", $1)}) print("The token: \(tokenString)") }
quelle
Wenn Sie in einem Build-Einstellungssatz die Codesignatur für das Bereitstellungsprofil haben, erhalten Sie auf jeden Fall die Token-ID, wenn Sie über ein APN-Aktivierungszertifikat verfügen. und entfernen
Bereitstellungsprofil: Automatisch
und setzen auf
Bereitstellungsprofil: Ihr Bereitstellungsprofilzertifikat.
quelle
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { let tokenParts = deviceToken.map { data -> String in return String(format: "%02.2hhx", data) } let token = tokenParts.joined() print("Token\(token)") }
quelle
Um das Geräte-Token zu erhalten, verwenden Sie den folgenden Code. Sie können das Geräte-Token jedoch nur mit einem physischen Gerät abrufen. Wenn Sie das Gerätetoken senden müssen, können Sie während der Verwendung des Simulators die folgende Bedingung stellen.
if(!(TARGET_IPHONE_SIMULATOR)) { [infoDict setValue:[[NSUserDefaults standardUserDefaults] valueForKey:@"DeviceToken"] forKey:@"device_id"]; } else { [infoDict setValue:@"e79c2b66222a956ce04625b22e3cad3a63e91f34b1a21213a458fadb2b459385" forKey:@"device_id"]; } - (void)application:(UIApplication*)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData*)deviceToken { NSLog(@"My token is: %@", deviceToken); NSString * deviceTokenString = [[[[deviceToken description] stringByReplacingOccurrencesOfString: @"<" withString: @""] stringByReplacingOccurrencesOfString: @">" withString: @""] stringByReplacingOccurrencesOfString: @" " withString: @""]; NSLog(@"the generated device token string is : %@",deviceTokenString); [[NSUserDefaults standardUserDefaults] setObject:deviceTokenString forKey:@"DeviceToken"]; }
quelle