リモートプッシュ通知の非表示はできるのか(調査)
特定条件下においてプッシュ通知を非表示にすることが求められたのでその調査をおこなった
リモートプッシュ通知の仕組み(iOS9まで)
参照: https://qiita.com/natsumo/items/8ffafee05cb7eb69d815
- プッシュ通知を許可するとAPNs(Apple Push Notification Service)から端末を識別するためのトークンが発行される
- これをプッシュ通知サーバーへ登録しておく
- サーバーからプッシュ通知が送られるときにこのトークンも一緒に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
公式にも書いてある
実際アプリ側で編集したほうを表示できないようにできても system originalのほうが表示されてしまう
他にも以下で紹介されている内容を試してみましたが非表示にすることはできなかった
結論
まだiOS13以降で試せてないけど少なくともiOS13以前ではやっぱりできなさそう
iOS13以降で試した際には実際にできたかどうかの結果を追記します
Discussion