iOS Device Token

当获取到device token后,AppDelegate将触发didRegisterForRemoteNotificationsWithDeviceToken方法,传入的参数是一个Data类型,而我们需要的是一个string,Swift在解析Data上比较简单:

let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()

对Data类型进行map操作,其中每一个element是一个UInt8%02x则将这个UInt8转换为十六进制输出,02是在指明输出两位,若不够两位则前面补零,简单直接。

在Objective-C中要如何操作呢?查阅了一下资料后,最佳方案为:

const char *data = [deviceToken bytes];
NSMutableString *tokenStr = [NSMutableString string];
for (int i = 0; i < [deviceToken length]; i++) {
  [tokenStr appendFormat:@"%02.2hhx", data[i]];
}

NSData的bytes将得到一个char数组,而我们需要将char进行格式化输出后append到一个NSString里,不容易理解的就是这个格式化输出符%02.2hhx。其中02和swift相同,hhx指明data[i]是一个unsigned char类型(hx - unsigned short),hhx前面的2指明两位,和%02用意上略有相同。可以参考https://www.yawintutor.com/format-specifiers-in-c/这篇博客了解.的用意。这里给出这篇博客中的一个例子:

#include 

int main(int argc, char** argv) {
    char s[] = "YawinTutor"; 
    printf("value actual                : [%s]\n", s); 
    printf("value with number           : [%15s]\n", s); 
    printf("value with minus+number     : [%-15s]\n", s); 
    printf("value with number+dot       : [%15.5s]\n", s); 
    printf("value with minus+number+dot : [%-15.5s]\n", s); 

    printf("value with dot              : [%.5s]\n", s); 
    printf("value with minus            : [%-s]\n", s); 
    printf("value with minus+dot        : [%-.5s]\n", s); 
    return 0;
}

Output

value actual                : [YawinTutor]
value with number           : [     YawinTutor]
value with minus+number     : [YawinTutor     ]
value with number+dot       : [          Yawin]
value with minus+number+dot : [Yawin          ]
value with dot              : [Yawin]
value with minus            : [YawinTutor]
value with minus+dot        : [Yawin]

你可能感兴趣的:(iOS Device Token)