某天老闆心血來潮,要推播促銷活動,發現奇怪的問題⋯⋯查詢後原來是iOS 13 Apple推播通知回傳的Device Token改變了規則~
我立馬測試我們家App取得的Device Token,結果如下:
Xcode 11編譯跑在iOS 13
Printing description of deviceToken:
<a9df8591 f9be281b 45b7fd30 c452c298 05d04532 1c8e5e93 83079040 2efd1b83>
Printing description of deviceTokebStr:
{length=32,bytes=0xa9df8591f9be281b45b7fd30c452c298…830790402efd1b83}
Xcode 11編譯跑在iOS 11
Printing description of deviceToken:
<f144b48d 96957ab9 16717a2e e36d56a3 e91c0f7f 48623985 021173dd c4097c0e>
Printing description of deviceTokebStr:
f144b48d96957ab916717a2ee36d56a3e91c0f7f48623985021173ddc4097c0e
可以看到原本該是64字元的字串,變成有length和bytes,於是乎要再另外處理。
我常用Onesignal來測試推播,從官網找到它部落格文章,有非常詳盡的說明。
問題在於:從Xcode 11開始,已將發送到iOS中的推送令牌委託的deviceToken數據的description屬性更改為其他格式。
/**
Theme: Get Device Token String
IDE: None
Language: Objective C
Date: 108/11/15
Author: HappyMan
Blog: https://cg2010studio.com/
*/
+ (NSString *)stringFromDeviceToken:(NSData *)deviceToken {
NSUInteger length = deviceToken.length;
if (length == 0) {
return nil;
}
const unsigned char *buffer = deviceToken.bytes;
NSMutableString *hexString = [NSMutableString stringWithCapacity:(length * 2)];
for (int i = 0; i < length; ++i) {
[hexString appendFormat:@"%02x", buffer[i]];
}
return [hexString copy];
}
修改完後再來測試,已能將正確格式的Device Token送到我們家Server囉~
Xcode 11編譯跑在iOS 13
Printing description of deviceToken:
<a9df8591 f9be281b 45b7fd30 c452c298 05d04532 1c8e5e93 83079040 2efd1b83>
Printing description of deviceTokebStr:
a9df8591f9be281b45b7fd30c452c29805d045321c8e5e93830790402efd1b83
Xcode 11編譯跑在iOS 11
Printing description of deviceToken:
<f144b48d 96957ab9 16717a2e e36d56a3 e91c0f7f 48623985 021173dd c4097c0e>
Printing description of deviceTokebStr:
f144b48d96957ab916717a2ee36d56a3e91c0f7f48623985021173ddc4097c0e
參考:OneSignal iOS 13 and Xcode 11 Changes That Affect Push Notifications。

Comments on: "[iOS] iOS 13 Device Token 問題" (1)
真好~搜尋到自己紀錄的文章! 😀
讚讚