IOS Device_token 从64位NSString反译回

2016-02-26  本文已影响0人  SilentHelianthu

//最简单的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。

上一篇 下一篇

猜你喜欢

热点阅读