🙆

リモートプッシュ通知の非表示はできるのか(調査)

2 min read

特定条件下においてプッシュ通知を非表示にすることが求められたのでその調査をおこなった

リモートプッシュ通知の仕組み(iOS9まで)

参照: https://qiita.com/natsumo/items/8ffafee05cb7eb69d815

  1. プッシュ通知を許可するとAPNs(Apple Push Notification Service)から端末を識別するためのトークンが発行される
  2. これをプッシュ通知サーバーへ登録しておく
  3. サーバーからプッシュ通知が送られるときにこのトークンも一緒にAPNsへ渡され、APNsは通知を受け取るとこのトークンを基にどの端末へ送るか判断だけしてそのまま流す

iOS10以降に登場したNotification Service app extension

上記のプッシュ通知の仕組みから分かる通りサーバーから送られた通知はAPNsでは流されるだけなので、iOS9までは一度サーバーから送られたらもうどうにもできなかった

これがiOS10からNotification Service app extensionというものが登場し少しかわる

Notification Service app extensionとは

参照: https://dev.classmethod.jp/articles/user-notifications-framework-13/

この app extension は UI を提供しないタイプの app extension であり、バックグラウンドで動作する
これを使うとユーザーに通知を見せる前に、リモート通知のペイロードを編集することができる

調査報告

iOS13からは非表示は可能みたいだけど
それ以前はこのapp extensionを使っても非表示にすることはできないらしい(まだiOS13で試せてない)

In WWDC 17's Best Practices and What’s New in User Notifications, Teja states explicitly that such a thing cannot be done (starting at 22:17 min):

All work should be either about modifying or enhancing this notification. The service extension also doesn't have the power to drop this notification or prevent it from being displayed. This notification will get delivered to the device. If instead you want to launch your application in the background and run some additional processing, you should send a silent notification. You can also send a silent notification and launch your app in the background and your app can determine whether or not to schedule a local notification if you want to present a conditional notification.

参照: https://stackoverflow.com/a/46157854

公式にも書いてある

参照: https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_developer_usernotifications_filtering

実際アプリ側で編集したほうを表示できないようにできても system originalのほうが表示されてしまう

他にも以下で紹介されている内容を試してみましたが非表示にすることはできなかった

https://stackoverflow.com/questions/53817182/how-to-remove-push-notifications-that-have-already-been-sent

結論

まだiOS13以降で試せてないけど少なくともiOS13以前ではやっぱりできなさそう
iOS13以降で試した際には実際にできたかどうかの結果を追記します

Discussion

ログインするとコメントできます