当获取到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 <stdio.h>
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]