人生で初めてQiitaに投稿します。
めっちゃ緊張してます。
Qiitaの文字3回うち間違えました。
なお、この記事の元ネタはもともと私が書いていたブログに書いていたものをリライトしたものです。
リライトしているのでこちらの方まだ読みやすいのはわかってますが、それでもほんのちょぴっとでもブログの方を覗いてもらえると嬉しいです。
https://yara-shimizu.com/2019/10/05/ios-ver13/
iOS13になってPush通知が届かなくなってしまった??
タイトルの通り、iOS13にPush通知が届かなくなったので調べました。
環境
Mac Mojave 10.14.6
xcode 11(おそらく10以下でも発生する)
iOS 13.4.1
Objective-C
現象
・iOS12以前は正常にPush通知が送れている
・iOS13以降でのみ通知が届かなくなった
原因
これが100%原因かどうかはソースを見ないとなんとも言えないですが、私の場合はトークンを取得する次のコードの「description」が原因でした。
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
//デバイストークン取得後の処理 "<" ">" " "を削除
NSString *token = [[[[deviceToken description] stringByReplacingOccurrencesOfString:@"<"withString:@""] stringByReplacingOccurrencesOfString:@">" withString:@""]
stringByReplacingOccurrencesOfString: @" " withString: @""];
}
こんな感じでdeviceTokenを取得して、不要な文字列を削除して通知に利用するというような運用でしたが、iOS13以降ではdescriptionの返り値が変更になったようで別の方法を使わないといけないよう。このク◯が、、、~
バージョン | 返り値 |
---|---|
iOS12以前 | <00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000> |
iOS13以降 | {length = 32, bytes = 0x00000000 00000000 00000000 00000000 … 00000000 00000000 } |
解決方法
descriptionがいけないということで、関数を自作して対応をします。
天下のFacebook様も同じ対応をしています。
参考:https://forums.developer.apple.com/thread/117545
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {
NSString *token = [self hexadecimalStringFromData:deviceToken];
}
- (NSString *)hexadecimalStringFromData:(NSData *)data {
NSUInteger dataLength = data.length;
if (dataLength == 0) {
return nil;
}
const unsigned char *dataBuffer = data.bytes;
NSMutableString *hexString = [NSMutableString stringWithCapacity:(dataLength * 2)];
for (int i = 0; i < dataLength; ++i) {
[hexString appendFormat:@"%02x", dataBuffer[i]];
}
return [hexString copy];
}
最後に
初めてQiitaで記事をかきましたが、サイトのデザインがきれいなので中身が私みたいにゴミでもなんだかそれっぽくなりますね。
またxcode等で困った出来事があったらQiitaに書くかもです。
なにか間違い等の指摘がございましたらコメントくださると嬉しいです。
読んでくださってありがとうございました。