當(dāng)獲取到device token后,AppDelegate將觸發(fā)didRegisterForRemoteNotificationsWithDeviceToken
方法说庭,傳入的參數(shù)是一個(gè)Data
類型然磷,而我們需要的是一個(gè)string,Swift在解析Data上比較簡(jiǎn)單:
let deviceTokenString = deviceToken.map { String(format: "%02x", $0) }.joined()
對(duì)Data類型進(jìn)行map操作刊驴,其中每一個(gè)element是一個(gè)UInt8
姿搜,%02x
則將這個(gè)UInt8
轉(zhuǎn)換為十六進(jìn)制輸出,02
是在指明輸出兩位缺脉,若不夠兩位則前面補(bǔ)零痪欲,簡(jiǎn)單直接。
在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將得到一個(gè)char數(shù)組,而我們需要將char進(jìn)行格式化輸出后append到一個(gè)NSString里礁扮,不容易理解的就是這個(gè)格式化輸出符%02.2hhx
知举。其中02
和swift相同,hhx
指明data[i]是一個(gè)unsigned char類型(hx
- unsigned short)太伊,hhx
前面的2指明兩位雇锡,和%02
用意上略有相同×沤梗可以參考https://www.yawintutor.com/format-specifiers-in-c/這篇博客了解.
的用意锰提。這里給出這篇博客中的一個(gè)例子:
#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]