expo notificationでPUSH_TOO_MANY_EXPERIENCE_IDSのエラーが出たときの対処方法

expo notificationでPUSH_TOO_MANY_EXPERIENCE_IDSのエラーが出たときの対処方法

expo-notificationsexpo-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
  }]
}

前提

エラーの詳細

このエラーのコードは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

公式ドキュメント

Anycloudではプロダクト開発の支援を行っています

プロダクト開発をお考えの方はぜひAnycloudにご相談ください。

まずは相談する

記事を書いた人

そうま

エンジニア

そうま

Anycloudでエンジニアをしています。