Holen Sie sich das Gerätetoken für die Push-Benachrichtigung

84

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.

jagzzz
quelle
Hast du alle Schritte befolgt ? Wenn Sie keine Probleme mit der Zertifizierung und Bereitstellung sowie dem Code haben, müssen Sie einen kleinen Fehler machen. Sagen Sie mir, führen Sie die App auf einem realen Gerät aus, das dasselbe mit Ihrem System verbindet? Bemerken Sie auch, ob Sie das Geräte-Token im Konsolenprotokoll erhalten oder nicht? Haben Sie die Push-Benachrichtigung im iPhone aktiviert ?
Sarah
Ich kann kein Geräte-Token im Konsolenprotokoll abrufen.
Jagzzz
Ich führe die App auf einem realen Gerät ohne Fehler aus.
Jagzzz
Haben Sie APNS wie im Link auf dem iPhone gezeigt aktiviert?
Sarah
Ja, ich habe APNS aktiviert. Aber das Geräte-Token kann nicht auf Cosole abgerufen werden
jagzzz

Antworten:

162

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)")
}
Wasif Saood
quelle
4
Überprüfen Sie anschließend Ihr Bereitstellungsprofil. Es sollte die App-ID enthalten, mit der Sie Ihr SSL-Zertifikat für die Push-Benachrichtigung erstellt haben.
Wasif Saood
1
Sie müssen den Code in die AppDelegate-Datei @jagzzz
codercat
2
Für diejenigen, die an einem in Swift geschriebenen Codebeispiel
Benjamin
3
Vorsicht, die Verwendung der Eigenschaft "description" funktioniert nicht mehr: stackoverflow.com/questions/39495391/…
hariseldon78
1
@codester Ich habe meinen Build mit Xcode 10.3 hochgeladen und er ist live. Gemäß Ihrer Aussage wird die Objective C-Methode ab XCode 11 nicht mehr funktionieren, aber was ich in unserer Datenbank sehen kann, zeigt die Datenlänge anstelle einer korrekten Zeichenfolge von Apns-Token an. Ich möchte nur wissen, ob es von der Xcode-Version oder der iOS-Version (dh 13. *) abhängt.
Pradip Sutariya
13

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);
}
Bkillnest
quelle
11

Die Verwendung von descriptionso 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()
cdstamper
quelle
7

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);
}
Jake Cronin
quelle
5

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);
Nimit Parekh
quelle
2
Dies war nie die richtige Lösung. Basieren Sie niemals etwas auf dem description.
rmaddy
5

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()
Antoine
quelle
Niemals descriptionfür Binärdaten verwenden (siehe andere Antwort)
cdstamper
4

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
Nilesh
quelle
3

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.

Andrey Gagan
quelle
1
Zu Ihrer Information - jede Antwort, die jemals verwendet wurde, descriptionwar immer falsch. Dies ist nur eine mögliche Lösung, um das Token in einen String umzuwandeln. Eine viel einfachere Lösung besteht darin, die NSDatain eine NSStringStandard-Base64-Codierung umzuwandeln .
rmaddy
1

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)")

}
Sedat Y.
quelle
1

In Ihrem AppDelegate in der didRegisterForRemoteNotificationsWithDeviceTokenMethode:

Aktualisiert für Swift:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
    print("\(deviceToken.reduce("") { $0 + String(format: "%02.2hhx", arguments: [$1]) })")
}
vfn
quelle
0

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)")
    }
James Ryan
quelle
-1

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.

Kalpesh
quelle
-1
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)")
}
Amit Gupta
quelle
-4

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"];
}
Yash
quelle