expo notificationでPUSH_TOO_MANY_EXPERIENCE_IDSのエラーが出たときの対処方法
expo-notificationsとexpo-server-sdk-rubyを使用して、プッシュ通知の送信を実装していたのですが、プッシュ通知送信時に以下のようなエラーが発生して、プッシュ通知を送信できないことがあったので、備忘録として対処方法を載せておきます。
Unknown error format: {
"errors":[{
"code":"PUSH_TOO_MANY_EXPERIENCE_IDS",
"message":"All push notification messages in the same request must be for the same project; check the details field to investigate conflicting tokens.",
"details":{
"@project1":["ExponentPushToken[token1]","ExponentPushToken[token2]","ExponentPushToken[token3]","ExponentPushToken[token4"],
"@project2":["ExponentPushToken[userToken1]","ExponentPushToken[userToken2]"]
},
"isTransient":false
}]
}
前提
- expo-notificationsを使用している
- expo-server-sdk-rubyを使用している
- DBにexpo tokenを保存しているかつ、プロジェクトの情報は保存していない
エラーの詳細
このエラーのコードはPUSH_TOO_MANY_EXPERIENCE_IDS
で、プッシュ通知を複数のexpoプロジェクトに送信すると発生します。
expo-server-sdk-rubyだと以下のように、一度に複数のtokenに対してプッシュ通知を送信することができます。
client = Exponent::Push::Client.new
expo_tokens = ["ExponentPushToken[token1]", "ExponentPushToken[token2]"]
client.send_messages({ to: expo_tokens, title: 'title', body: 'body' })
このときに、ExponentPushToken[token1]
とExponentPushToken[token2]
が別のexpoプロジェクトに紐付いていると、今回のエラーが発生します。
参考
解決策
解決するには、単純にプッシュ通知送信時に、別プロジェクトのtokenが混じらないようにするしかありません。
僕らのプロダクトでは、DBにtokenを保存していたため、DBから別プロジェクトのtokenを削除する必要がありました。
しかし、tokenからプロジェクトの情報を取得する方法が提供されていないため、PUSH_TOO_MANY_EXPERIENCE_IDS
のエラーをハンドリングして、エラー詳細から別プロジェクトのtokenを取得し、削除するようにしました。
以下のようにエラーメッセージに、プロジェクトごとのtokenの情報があるため、エラーメッセージをパースして、別プロジェクトのtokenを削除してから、プッシュ通知の再送信を行うようにしています。
Unknown error format: {
"errors":[{
"code":"PUSH_TOO_MANY_EXPERIENCE_IDS",
"message":"All push notification messages in the same request must be for the same project; check the details field to investigate conflicting tokens.",
"details":{
// プロジェクトごとの情報
"@project1":["ExponentPushToken[token1]","ExponentPushToken[token2]","ExponentPushToken[token3]","ExponentPushToken[token4"],
"@project2":["ExponentPushToken[userToken1]","ExponentPushToken[userToken2]"]
},
"isTransient":false
}]
}
注意点としては、exponent-server-sdk-ruby
の最新リリースでは、エラーメッセージにプロジェクトの情報が表示されませんが、最新のコミットでは表示されるようになっているため、コミットを指定してgemをインストールする必要があります。
gem 'exponent-server-sdk', git: '<https://github.com/expo-community/expo-server-sdk-ruby.git>', ref: '9f1e2397e528484375f1fc76e3929c6cd8060a76'
まとめ
かなりエッジケースかもしれませんが、今回のエラーの日本語のドキュメントが見つからなかったため、書いてみました。
プロジェクト情報を取得するために、エラーメッセージをパースするという、少し辛いことをしているので、もっと良い解決策をご存知の方は教えていただけると嬉しいです。。
また、これからexpo-notificationsを使用して、プッシュ通知の実装をする方がいれば、tokenとprojectIdをセットで保存しておくと、とても楽に対処できるのでおすすめです。
参考
同様のIssue
公式ドキュメント