//最简单的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。
网友评论