美文网首页
IOS Device_token 从64位NSString反译回

IOS Device_token 从64位NSString反译回

作者: SilentHelianthu | 来源:发表于2016-02-26 10:06 被阅读0次

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

    相关文章

      网友评论

          本文标题:IOS Device_token 从64位NSString反译回

          本文链接:https://www.haomeiwen.com/subject/ghpmkttx.html