IOS Device_token 從64位NSString反譯回32bytes的NSData

//最簡單的Token獲取

NSString *newToken = [deviceToken description];

newToken = [newToken stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];

newToken = [newToken stringByReplacingOccurrencesOfString:@" " withString:@""];

這是我們普遍常用的方法 但是萬一有一天蘋果修改description的方法那將解析錯誤,還有這種方法是不安全的。

最好的做法是參考的stackoverflow的

//安全的token獲取

NSString*newToken = [NSStringstringWithFormat:@"%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])];

和第一種方法獲取到的token是一樣的


//翻譯過的token如何再轉回32bytes的NSData

由于parse關閉導致線上的推送受到影響,為了兼容版本,所以想從parse和個推把推送遷移到友盟上,但遇到問題了,服務器上存的token是64位的翻譯過的string,但是友盟的regester方法注冊用的token是原始的32betys的NSdate,于是想到了NSString直接用encoding直接轉回NSData,但是發現無論用UTF-8還是其它方法 都無法轉回32bytes的NSData,于是開始找解決方法,終于在stackoverflow上找到了代碼

NSString*newToken =@"e39cc6d8b8778c23baa6618cCXXXXXXXXb9bab0c9d841";

NSMutableData*apnsTokenMutableData = [[NSMutableDataalloc]init];

unsignedcharwhole_byte;

charbyte_chars[3] = {'\0','\0','\0'};

inti;

for(i=0; i < [newTokenlength]/2; i++) {

byte_chars[0] = [newTokencharacterAtIndex:i*2];

byte_chars[1] = [newTokencharacterAtIndex:i*2+1];

whole_byte =strtol(byte_chars,NULL,16);

[apnsTokenMutableDataappendBytes:&whole_bytelength:1];

}

NSData*apnsTokenData = [NSDatadataWithData:apnsTokenMutableData];

這樣就可以翻譯回去了http://stackoverflow.com/questions/7317860/converting-hex-nsstring-to-nsdata。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容