recognize Iphone設備令牌-NSData或NSString




mac連接iphone (5)

我不認為這是一個很好的解決方案,因為您必須在將通知發送到Apple服務器之前重新構建字符串。 使用Base64編碼傳輸字符串或類似的東西。

我正在以NSData對象的形式接收iPhone設備令牌。 當我測試我的通知腳本功能時,我只從日誌中復制了該對象,並且通知正常。 但是,當我現在嘗試自動執行此操作時,我將以變量的形式將設備令牌作為ASCII編碼的字符串發送

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

我得到的字符串有一些時髦的字符,看起來類似於"å-0¾fZÿ÷ʺÎUQüRáqEªfÔk«"

當服務器端腳本將通知發送到該令牌時,我沒有收到任何內容。

我需要解碼一些東西嗎?

Regardz


將設備令牌轉換為六進制十進製字符串的另一種方法

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

我發現這個解決方案更好,因為iOS可以在將來的版本中更改描述的用法,因此在將來使用數據的描述屬性可能是不可靠的。 我們可以通過從數據令牌字節創建十六進制令牌來直接使用它。

 - (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];

}

我們還可以將設備令牌存儲在我們的NSUserdefaults中,稍後使用它將其發送到我們的服務器。


好的,我找到了解決方案。 如果有人有同樣的問題,忘記ASCII編碼,只需使用以下行生成字符串:

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

如果有人想在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)")
}

編輯:對於Swift 3

Swift 3引入了Data類型,帶有值語義。 要將deviceToken轉換為String,您可以執行以下操作:

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




token