//最簡單的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。