はじめに
今回はiOS13のプッシュ通知用デバイストークンについて見ていきたいと思います。
Swift に関して言えば、歴史的変遷から、問題のない現場が多いと思うのですが、
Objective-C を中心に活用している現場では注意が必要かもしれません。
具体的には後述しますが、
description を利用してデバイストークンを取得する方式は iOS13 から見直す必要がありそうです。
プッシュ通知の受信処理の実装
折角なので、基本的な設定についても説明していきます。
Xcode11の設定
まずは、Xcode11上で下図の状態まで設定します。
▼確認観点
* Team ID が利用想定のものであること
* Bundle Identifier が利用想定のものであること
* Signing Certificate が利用想定のものであること
* Provisioning Profile の Capabilities に Push Notifications が含まれている
* Capability として Push Notifications が追加すること

AppDelegateの実装
続いて、 AppDelegate.swift 上の実装です。
基本的なステップは4つです。
① プッシュ通知の利用許可のリクエストを送信します
② 利用許可を得た場合に、プッシュ通知の利用登録を実行します
③ プッシュ通知の利用登録が成功したことをキャッチする Delegate メソッドを書きます
④ プッシュ通知の利用登録が失敗したことをキャッチする Delegate メソッドを書きます
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | |
旧来のデバイストークンの取得方法
さて本題に入ります。
Objective-C 時代に主流と言われていたデバイストークンの取得方法は、以下のような description を利用した手法でした。
1 2 3 | |
これは、 [deviceToken description] で取得される値が、
<7097978d 1e438923 ... 6fdbf111> というような先頭と末尾を <> で括られていたためです。
そして、1文で書けるというのも当時から魅力的だったのかもしれません。
Swift に言語が変わってからも、上記手法が多くの場面で使われてきたことと思います。
しかし、 Swift3 になったタイミングで、状況が変わりました。
プッシュ通知の利用登録成功時の Delegate メソッドの deviceToken が NSData 型から Data 型に変わったことで、この手法が利用できなくなったのです。
この時点で
1
| |
という書き方がデバイストークン取得の主流に完全に取って代わったと思います。
もしかしたら、 Data 型を NSData 型に変換することで、
引き続き旧来の手法を利用している現場があるかもしれませんが、
その場合は、即刻デバイストークンの取得方法を見直しましょう。
これはあくまでも Swift におけるデバイストークンの取得の変遷であって、
Objective-C は何ら変わることがなかったため、
旧来の書き方が続いている現場がまだまだ多い気がしています。
しかし、 iOS13 からはどうやら見直しが必須になったようです。
というのも、 description を利用すると
1
| |
のような形で返ってきてしまうため、
<> を除去することでデバイストークンを取得することができなくなったようなんです。
- Apple Developer Forums: iOS13 PKPushCredentials broken
- Apple Developer Forums: NSData description and NSString stringWithFormat have different return results when compiled with Xcode 11 versus Xcode 10
では、 Swift は先程書いた通り1行で書けますが、
Objective-C ではどう書いていくべきなのでしょうか。
安心してください。 Facebook が1つの解を示してくれています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | |
流石に1行で済ませることは難しいですが、
これで Objective-C でも正しくデバイストークンを取得できるようになりました。
まとめ
さて如何でしたでしょうか。
iOS13は細かいところも含めて様々な変更が入っているため、日々最新情報をキャッチしつつ、自身でも積極的に使い倒していく必要がありますね。
と言ったところで本日はここまで。