8

Ich muss das APNS-Geräte-Token meiner iOS-App an meinen Provider senden, indem ich einen Service anrufe, der JSON-Daten in meiner Anfrage erwartet. Ich lese Apples Local and Push Notification Programming Guide und es sagt nur, dass die application:didRegisterForRemoteNotificationsWithDeviceToken: Delegate-Methode das Gerät Token als NSData übergeben und Sie sollten es an Ihren Provider in Binärdaten codiert übergeben. Aber ich muss es in eine Zeichenfolge konvertieren, um eine JSON-Anfrage an meinen Provider senden zu können.iOS APNS: Senden des Geräte-Tokens an den Provider im Stringformat

Ich habe auch mehrere Beiträge zu diesem Thema gelesen, da es aussieht, ist es ein häufiges Szenario, aber ich habe einige verschiedene Möglichkeiten gefunden, um solche Gerät Token in String zu konvertieren, um es zu senden, und ich bin mir nicht sicher welche von ihnen sollte am besten geeignet sein. Was wäre der zuverlässigste Weg, damit umzugehen? Ich nehme an, dass mein Provider diese Zeichenfolge zurück in Aufruf APNS konvertieren muss, und ich muss dieses Token auch in der App speichern, um es sicher mit dem neuen Wert zu vergleichen, wenn ein neues Token generiert wird und application:didRegisterForRemoteNotificationsWithDeviceToken: aufgerufen wird, um das zu senden Token nur, wenn es sich geändert hat.

Dank

Antwort

10

Sie haben Recht, dass Sie das Gerät Token NSData-NSString zu der Lage sein, es zu senden mit einem JSON-Objekt zu konvertieren. Aber welche Konvertierungsmethode Sie wählen, ist vollständig Ihnen oder den Anforderungen des Anbieters. Die gebräuchlichsten Methoden sind eine hexadezimale Zeichenfolge (siehe beispielsweise Best way to serialize an NSData into a hexadeximal string) oder eine Base64-Zeichenfolge (unter Verwendung von base64EncodedStringWithOptions). Beide sind 100% "zuverlässig".

Auch sollten Sie immer das Gerät Token an den Anbieter und nicht nur, wenn es geändert hat, senden. Der Provider muss eine Datenbank aller Geräte-Token mit einem Zeitstempel von beim letzten Absenden halten, um den Zeitstempel mit einer möglichen Antwort aus dem "Feedback-Service" zu vergleichen.

+0

Danke, habe ich endlich den Code, den Sie angegeben, um eine hexadezimale Zeichenfolge – AppsDev

0
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)_deviceToken { 

NSString *str = [NSString stringWithFormat:@"%@",_deviceToken]; 
//replace '<' and '>' along with spaces before you send it to the server. 
} 

Dies hat zuverlässig für mich auf fast allen Web-Plattformen funktioniert.

8

In didFinishLaunchingWithOptions Methode

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0) 
{ 
    [[UIApplication sharedApplication] registerUserNotificationSettings:[UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeSound | UIUserNotificationTypeAlert | UIUserNotificationTypeBadge) categories:nil]]; 
    [[UIApplication sharedApplication] registerForRemoteNotifications]; 
} 
else 
{ 
    [[UIApplication sharedApplication] registerForRemoteNotificationTypes: 
    (UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound | UIRemoteNotificationTypeAlert)]; 
} 

Nach oben Codezeilen zu tun, fügen Sie das Verfahren unter

#pragma mark Push Notifications 
- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken 
{ 
NSString *token_string = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"withString:@""] 
         stringByReplacingOccurrencesOfString:@">" withString:@""] 
         stringByReplacingOccurrencesOfString: @" " withString: @""]; 
NSString* strURL = [NSString stringWithFormat:@"http://www.sample.com?device_token=%@&type=IOS",token_string]; 
strURL=[strURL stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
NSLog(@"%@",strURL); 
NSData *fileData = [NSData dataWithContentsOfURL:[NSURL URLWithString:strURL]]; 
NSLog(@"content---%@", fileData); 
} 

Nach den oben aufgeführten Schritte können Sie diese delegieren Funktion verwenden, um Push-Benachrichtigung einmal abrufen und verarbeiten es kommt. Die unten hinzugefügte Methode wird ausgelöst entweder die App läuft im Hintergrund oder nicht. Die unten angegebene Methode ist erhältlich von ios7.0

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))handler 
+0

erstellen Dies ist mein Verständnis zu implementieren PushNotification, wenn Sie irgendwelche Fehler mit diesem Code finden Sie bitte frei zu addd ..... –

+1

Hatte ähnliches Problem, die Lösung war, Ihrer Antwort zu folgen, die alle "Raum" -Zeichen von dem Gerät Token entfernen sollte. Dies war für PushSharp nicht sicher, ob dies eine allgemeine Richtlinie für die Push-Benachrichtigungs-API ist. – David

5
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])]; 

Konvertieren von Daten in Bytes bedeutet, dass wir es zählen können. Entfernen von Leerzeichen und <> ist wirklich keine gute Idee

+0

Macht viel mehr Sinn als die anderen zukünftigen fehleranfälligen "description" Ansätze! Vielen Dank! –

Verwandte Themen