8

Muszę wysłać token urządzenia APNS z mojej aplikacji na iOS do mojego dostawcy, dzwoniąc do usługi, która oczekuje danych JSON w mojej prośbie. Czytam numer Local and Push Notification Programming Guide firmy Apple i mówi tylko, że metoda delegata application:didRegisterForRemoteNotificationsWithDeviceToken: przekazuje token urządzenia jako NSData i należy przekazać go do dostawcy zakodowanego w danych binarnych. Ale muszę go przekonwertować na ciąg znaków, aby móc wysłać żądanie JSON do mojego dostawcy.APLIKACJE IOS: wysłanie tokenu urządzenia do dostawcy w formacie ciągu znaków

Czytałem również kilka postów związanych z tym, ponieważ wygląda na to, że jest to typowy scenariusz, ale znalazłem kilka różnych sposobów konwersji takiego tokena urządzenia na ciąg, aby go wysłać, i nie jestem pewien który z nich powinien być najbardziej odpowiedni. Który z tych sposobów byłby najbardziej wiarygodny? Przypuszczam, że mój dostawca będzie musiał przekonwertować ten ciąg z powrotem na wywołanie APNS, a także muszę zapisać ten token w aplikacji, aby bezpiecznie porównać go z nową wartością, jeśli zostanie wygenerowany nowy token i zostanie wywołany application:didRegisterForRemoteNotificationsWithDeviceToken:, aby wysłać token tylko, jeśli się zmienił.

Dzięki

Odpowiedz

10

Masz rację, że trzeba konwertować token urządzenia z NSData do NSString do móc wysłać go z obiektu JSON. Ale wybrana przez Ciebie metoda konwersji całkowicie zależy od Ciebie lub od wymagań dostawcy. Najpopularniejszymi metodami są ciąg szesnastkowy (patrz na przykład Best way to serialize an NSData into a hexadeximal string) lub ciąg Base64 (przy użyciu base64EncodedStringWithOptions). Oba są w 100% "niezawodne".

Należy również zawsze wysyłać token urządzenia do dostawcy, a nie tylko po jego zmianie. Dostawca musi przechowywać bazę danych wszystkich tokenów urządzeń z sygnaturą czasową , kiedy została ostatnio wysłana, w celu porównania sygnatury czasowej z możliwą odpowiedzią z "usługi opinii".

+0

Dzięki, w końcu użyłem kodu, który wskazałeś, aby utworzyć ciąg szesnastkowy. – 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. 
} 

to działa niezawodnie dla mnie na prawie wszystkich platformach internetowych.

8

W metodzie didFinishLaunchingWithOptions

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

Po wykonaniu powyżej linii kodu, dodać metodę poniżej

#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); 
} 

Po wyżej wymienionych kroków można użyć tej funkcji delegata do pobierania i uchwyt powiadomienia push raz przychodzi.Ta dodana metoda uruchomi się albo aplikacja działa w tle, albo nie. Podana poniżej metoda jest dostępna od ios7.0

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

To jest moje zrozumienie do wdrożenia pushnotification, jeśli znajdziesz jakieś błędy w tym kodzie, proszę dodaj ..... –

+1

Miał podobny problem, rozwiązaniem było zastosowanie się do odpowiedzi, która polegała na usunięciu wszystkich znaków "spacji" z tokena urządzenia. To było dla PushSharp nie jestem pewien, czy jest to ogólna wytyczna dla API Push Notification. – 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])]; 

Konwersja danych na bajty oznacza, że ​​możemy to policzyć. Usuwanie spacji i <> naprawdę nie jest dobrym pomysłem

+0

Ma o wiele więcej sensu niż inne przyszłe podejścia "opisowe" podatne na błędy! Dzięki! –

Powiązane problemy