2009-10-19 14 views
33

Otrzymuję token urządzenia iPhone w postaci obiektu NSData. Kiedy testowałem funkcję skryptu powiadomień, skopiowałem ten obiekt tylko z dziennika i powiadomienia poszły dobrze. Jednak gdy próbuję teraz automatycznie to zrobić, jestem wysyłania token urządzenie jak ASCII zakodowany ciąg w postaci zmiennejToken urządzenia iPhone - NSData lub NSString

self.deviceToken = [[NSString alloc] initWithData:webDeviceToken encoding:NSASCIIStringEncoding]; 

Ciąg że jestem coraz ma jakieś funkowe znaków i wygląda podobnie do tego "å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"

Kiedy skrypt po stronie serwera wysyła powiadomienie do tego tokena, nic nie otrzymuję.

Czy muszę coś dekodować i jak?

Regardz

+0

Znalazłem inne rozwiązanie tutaj, wygląda bardziej przyszłościowo niż metoda "opis". http://stackoverflow.com/questions/1959600/how-to-use-objective-c-to-send-device-token-for-push-notifications-and-other-use –

+0

To dziwne, myślę, że to NSData * nie powinien być obiektem szczególnego rodzaju, dlatego próbowałem użyć NSUTF8StringEncoding i uzyskać inny wynik. Dla mnie nie do pomyślenia jest przekonwertowanie NSData na NSString za pomocą metody ** description **! Jakieś związane z documendacją jabłek? – Itachi

Odpowiedz

107

Ok, znalazłem rozwiązanie. Jeśli ktoś ma ten sam problem, zapomnieć o kodowaniu ASCII, po prostu zrobić łańcuch z następującymi liniami:

NSString *deviceToken = [[webDeviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]]; 
deviceToken = [deviceToken stringByReplacingOccurrencesOfString:@" " withString:@""]; 
+7

Proszę przestać upvoting tej odpowiedzi, to używa tokena .description - który jest po prostu, opis. Jest przeznaczony do odczytu przez człowieka w celu debugowania lub wyświetlania. "<" and ">" nie są częścią tokena, służą jedynie do formatowania wyświetlania. Apple może zmienić to na "[" lub "-" lub cokolwiek w przyszłości, jeśli chcą. Użyj jednej z odpowiedzi, która zamienia dane na ciąg szesnastkowy. –

2

nie sądzę, że jest to dobre rozwiązanie, ponieważ trzeba zrekonstruować ciąg przed wysłaniem powiadomienia Serwery Apple. Użyj kodowania Base64 do transmisji ciągów lub czegoś podobnego.

+0

Wysyłany ciąg działa od strony serwera bez żadnych rekonstrukcji lub modyfikacji. – Mladen

+0

Ale o ile widzę, usuwasz i przycinasz postacie ... Czy próbowałeś wysłać powiadomienie za pomocą tego tokena i zadziałało? Dlaczego? –

+0

Próbowałem i zadziałało. – Mladen

5

Znalazłem to rozwiązanie lepiej, ponieważ iOS może zmienić użycie opisu w przyszłych wersjach, więc użycie właściwości opisu na danych może być niewiarygodne w przyszłości. Możemy bezpośrednio użyć tego, tworząc tokena szesnastkowego z bajtów bajtów danych.

- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)devToken { 
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])]; 
[[MyModel sharedModel] setApnsToken:hexToken]; 

}

Możemy również przechowywać token urządzenia w naszych NSUserdefaults i użyć go później, aby wysłać go na nasz serwer.

0

Innym sposobem konwersji tokenu urządzenia do hexa ciągiem dziesiętnym

NSUInteger capacity = [deviceToken length] * 2; 
NSMutableString *stringBuffer = [NSMutableString stringWithCapacity:capacity]; 
const unsigned char *dataBuffer = [deviceToken bytes]; 
NSInteger i; 
for (i=0; i<[deviceToken length]; ++i) { 
    [stringBuffer appendFormat:@"%02X", (NSUInteger)dataBuffer[i]]; 
} 
NSLog(@"token string buffer is %@",stringBuffer); 
43

Jeśli ktoś szuka sposobu, aby to zrobić w SWIFT:

func application(application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: NSData) { 
    let tokenChars = UnsafePointer<CChar>(deviceToken.bytes) 
    var tokenString = "" 

    for i in 0..<deviceToken.length { 
     tokenString += String(format: "%02.2hhx", arguments: [tokenChars[i]]) 
    } 

    print("tokenString: \(tokenString)") 
} 

Edit: Dla Swift 3

Swift 3 wprowadza typ Data z semantyką wartości.Aby przekonwertować deviceToken do String, można to zrobić w następujący sposób:

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 

    var token: String = "" 
    for i in 0..<deviceToken.count { 
     token += String(format: "%02.2hhx", deviceToken[i] as CVarArg) 
    } 

    print(token) 
} 
+0

Thx! Dokładnie to, czego potrzebuję! – kimimaro

+1

Zaskakujące, że nie ma łatwego sposobu na szybkie uzyskanie odpowiednio zdekodowanych danych ciągów z obiektu tokena urządzenia NSData. Ale to jest przykład z @ sascha jest pierwszą rzeczą, na którą natknąłem się, że faktycznie działa! Dziękuję Ci. – Shiprack

+1

Teraz przenieś go do rozszerzenia NSData i nazwij go 'hexadecimalStringDescription()' – Eimantas

0

Dla Swift 3:

var tokenString: String = "" 
    for i in 0..<deviceToken.count { 
     tokenString += String(format: "%02.2hhx", deviceToken[i] as CVarArg) 
    } 

    print(tokenString) 

inna metoda

Tworzenie rozszerzenie danych dla coraz hexstring

extension Data { 
    var hexString: String { 
     return map { String(format: "%02.2hhx", arguments: [$0]) }.joined() 
    } 
} 

Zadzwoń na to rozszerzenie w

func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) { 
    let tokenString = deviceToken.hexString() 
    print("token: \(tokenString)") 
} 
+0

To działa dla Swift 2.0. Dzięki. –

+0

Nie należy polegać na .description, format, który otrzymasz, który jest nieudokumentowany i może technicznie zmienić. deviceToken.description powinien być używany tylko do celów debugowania. Użyj jednej z odpowiedzi, która zamienia bajty na ciąg szesnastkowy. –

+2

uzgodnione. Nie używaj tego. Podczas korzystania z PKPushCredentials opis teraz zwraca "32 bajty" – Tony

Powiązane problemy