この記事について
筆者がJavaで構成されるアプリのAPIサーバーを修正していたところ、自前のApiサーバーからAppleのApnsサーバーへpush通知の送信リクエストができなくなってしまいました。その際に対処したことを備忘録として残しておきます。
経緯
Apnsサーバーへpush通知の送信リクエストができなくなってしまったのですが、その際サーバーには以下のようなエラーログが吐かれていました。
[ERROR] NotificationSender:70 certificateName: □ □ □.p12 / Exception: java.util.concurrent.ExecutionException: java.io.IOException: Stream closed before a reply was received
このAPIサーバーで使用しているライブラリはpushyというものです。
筆者は上記のエラー文や、ライブラリ関係の文言でググってもなかなか原因がわかりませんでした。
セットする変数を誤っていただけだった
結局プッシュ通知が送信できなかった原因は、このライブラリのApnsClientのインスタンスを生成する際にセットする変数の値が、開発環境の場合は
api.sandbox.push.apple.com
なのですが、誤って本番用の値
api.push.apple.com
をセットしていたことでした。この変数の値はApnsサーバーのドメインに当たるものです。
https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/sending_notification_requests_to_apns/
今回、Apnsへのリクエスト送信処理やpush通知の証明書に問題がなく、エラー内容からも原因が特定しにくかったため、原因特定に時間がかかってしまいました。。。
このライブラリを使用していない場合でも、Javaで構成したサーバーからApnsサーバーへ送信するエンドポイントが誤っていた際には似たようなエラーが発生するかもしれません(エラー内容は異なるかも)。
まとめ
自前サーバーからApnsへpush通知が送信できない際には、一度送信先のエンドポイントを確認してみてください!