VoIPプッシュ通知でDeviceNotForTopicのエラーが出る

VoIPプッシュ通知でDeviceNotForTopicのエラーが出る
Pocket

iOS で VoIPプッシュ通知を試していてDeviceNotForTopicというエラーが出てハマったので解決策を共有。

原因

Provisioning ProfileとかCertificates周りに何かエラーがあるのかとばかり思っていたが、そうでもなかった。

Device Tokenは通常のAPNsのものと VoIP Push Notification のもので全く別のトークンとなる。APNs用のものを指定して VoIP Push 通知を送ろうとしてエラーになっていた。

ちなみにNWPusherを使用している場合は

Notification error: APN invalid token

というエラーが出ていた。

解決策

VoIP用のものは

pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType)

というデリゲートメソッドから取得。(pushCredentials.token でトークンを取得する)

APNs用のものは

application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data)

で取得する。

余談だが、Data型のtokenは

token.map { String(format: “%.2hhx”, $0) }.joined()

でString型に変換する。

Pocket