モバイル通知用の Amazon SNSプラットフォームエンドポイントの設定 - Amazon Simple Notification Service

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

モバイル通知用の Amazon SNSプラットフォームエンドポイントの設定

プッシュ通知サービスへのアプリケーションおよびモバイルデバイスの登録時に、プッシュ通知サービスはデバイストークンを返します。Amazon SNS はデバイストークンを使用してモバイルエンドポイントを作成し、そのエンドポイントにダイレクトプッシュ通知メッセージを送信できます。詳細については、「Amazon SNS ユーザー通知の前提条件」および「Amazon でのプッシュ通知の設定 SNS」を参照してください。

このセクションでは、プラットフォームエンドポイントの推奨作成方法について説明します。

プラットフォームエンドポイントの作成

Amazon でアプリに通知をプッシュするにはSNS、まずプラットフォームエンドポイントの作成アクションを呼び出しSNSて、そのアプリのデバイストークンを Amazon に登録する必要があります。このアクションは、プラットフォームアプリケーションの Amazon リソースネーム (ARN) とデバイストークンをパラメータとして受け取り、作成されたプラットフォームエンドポイントARNの を返します。

CreatePlatformEndpoint アクションは以下を実行します。

  • プラットフォームエンドポイントが既に存在する場合は、再度作成しないでください。既存のプラットフォームエンドポイントARNの呼び出し元に戻ります。

  • 同じデバイストークンを持つプラットフォームエンドポイントに異なる設定がすでに存在する場合は、再度作成しないでください。呼び出し元に例外をスローします。

  • プラットフォームエンドポイントが存在しない場合は、作成します。新しく作成したプラットフォームエンドポイントARNの を呼び出し元に戻します。

このアプローチでは、作業エンドポイントが常に提供されるとは限らないため、アプリケーションが起動するたびにプラットフォームエンドポイントの作成アクションを呼び出さないでください。これは、例えばアプリケーションがアンインストールされて同じデバイスに再インストールされ、そのアプリケーションのエンドポイントが既に存在しているが無効な場合などに発生する可能性があります。登録プロセスに成功すると、以下のことが達成されます。

  1. このアプリケーションデバイスの組み合わせにプラットフォームエンドポイントが存在することを確認します。

  2. プラットフォームエンドポイントのデバイストークンが最新の有効なデバイストークンであることを確認します。

  3. プラットフォームエンドポイントが有効であり、使用できる状態にあることを確認します。

擬似コード

次の擬似コードは、さまざまな開始条件において有効な最新の作業プラットフォームエンドポイントを作成するための推奨される方法について説明します。このアプローチは、アプリケーションが初めて登録されるかどうか、このアプリケーションのプラットフォームエンドポイントが既に存在するかどうか、プラットフォームエンドポイントが有効かどうか、適切なデバイストークンがあるかどうかなどに関係なく機能します。重複するプラットフォームエンドポイントが作成されたり、既に最新のプラットフォームエンドポイントが有効になっている場合に既存のプラットフォームエンドポイントが変更されたりしないため、連続して複数回呼び出しても安全です。

retrieve the latest device token from the mobile operating system if (the platform endpoint ARN is not stored) # this is a first-time registration call create platform endpoint store the returned platform endpoint ARN endif call get endpoint attributes on the platform endpoint ARN if (while getting the attributes a not-found exception is thrown) # the platform endpoint was deleted call create platform endpoint with the latest device token store the returned platform endpoint ARN else if (the device token in the endpoint does not match the latest one) or (GetEndpointAttributes shows the endpoint as disabled) call set endpoint attributes to set the latest device token and then enable the platform endpoint endif endif

このアプローチは、アプリケーションが自身を登録または再登録するときいつでも使用できます。デバイストークンの変更SNSを Amazon に通知するときにも使用できます。この場合、最新のデバイストークン値を持つアクションを呼び出すだけです。このアプローチについて注意が必要な点は次のとおりです。

  • プラットフォームエンドポイントの作成アクションの呼び出しが考えられる 2 つのケースがあります。これは、初回登録時に発生するようにARN、アプリが独自のプラットフォームエンドポイント を知らない、最初から呼び出すことができます。これは、アプリケーションがエンドポイントを知っているARNが削除された場合と同様に、最初のGetEndpointAttributesアクション呼び出しが検出できない例外で失敗した場合にも呼び出されます。

  • このGetEndpointAttributesアクションは、プラットフォームエンドポイントが作成されたばかりであっても、プラットフォームエンドポイントの状態を確認するために呼び出されます。これは、プラットフォームエンドポイントが既に存在するが無効になっている場合に発生します。この場合、プラットフォームエンドポイントの作成アクションが成功しますが、プラットフォームエンドポイントは有効にならないため、成功を返す前にプラットフォームエンドポイントの状態をもう一度確認する必要があります。

AWS SDK 例

次のコードは、 が提供する Amazon SNSクライアントを使用して以前の擬似コードを実装する方法を示しています AWS SDKs。

を使用するには AWS SDK、認証情報を使用して設定する必要があります。詳細については、「」および「ツールリファレンスガイド」の「共有設定ファイルと認証情報ファイルAWS SDKs」を参照してください。

CLI
AWS CLI

プラットフォームアプリケーションのエンドポイントを作成するには

次の create-platform-endpoint の例では、指定したトークンを使用して、指定したプラットフォームアプリケーションのエンドポイントを作成します。

aws sns create-platform-endpoint \ --platform-application-arn arn:aws:sns:us-west-2:123456789012:app/GCM/MyApplication \ --token EXAMPLE12345...

出力:

{ "EndpointArn": "arn:aws:sns:us-west-2:1234567890:endpoint/GCM/MyApplication/12345678-abcd-9012-efgh-345678901234" }
Java
SDK for Java 2.x
注記

の詳細については、「」を参照してください GitHub。用例一覧を検索し、AWS コード例リポジトリでの設定と実行の方法を確認してください。

import software.amazon.awssdk.regions.Region; import software.amazon.awssdk.services.sns.SnsClient; import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointRequest; import software.amazon.awssdk.services.sns.model.CreatePlatformEndpointResponse; import software.amazon.awssdk.services.sns.model.SnsException; /** * Before running this Java V2 code example, set up your development * environment, including your credentials. * * For more information, see the following documentation topic: * * https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/get-started.html * * In addition, create a platform application using the AWS Management Console. * See this doc topic: * * https://docs.aws.amazon.com/sns/latest/dg/mobile-push-send-register.html * * Without the values created by following the previous link, this code examples * does not work. */ public class RegistrationExample { public static void main(String[] args) { final String usage = """ Usage: <token> <platformApplicationArn> Where: token - The device token or registration ID of the mobile device. This is a unique identifier provided by the device platform (e.g., Apple Push Notification Service (APNS) for iOS devices, Firebase Cloud Messaging (FCM) for Android devices) when the mobile app is registered to receive push notifications. platformApplicationArn - The ARN value of platform application. You can get this value from the AWS Management Console.\s """; if (args.length != 2) { System.out.println(usage); return; } String token = args[0]; String platformApplicationArn = args[1]; SnsClient snsClient = SnsClient.builder() .region(Region.US_EAST_1) .build(); createEndpoint(snsClient, token, platformApplicationArn); } public static void createEndpoint(SnsClient snsClient, String token, String platformApplicationArn) { System.out.println("Creating platform endpoint with token " + token); try { CreatePlatformEndpointRequest endpointRequest = CreatePlatformEndpointRequest.builder() .token(token) .platformApplicationArn(platformApplicationArn) .build(); CreatePlatformEndpointResponse response = snsClient.createPlatformEndpoint(endpointRequest); System.out.println("The ARN of the endpoint is " + response.endpointArn()); } catch (SnsException e) { System.err.println(e.awsErrorDetails().errorMessage()); } } }

詳細については、「モバイルプッシュAPIアクション」を参照してください。

トラブルシューティング

古いデバイストークンを使用してプラットフォームエンドポイントの作成を繰り返し呼び出す

特にFCMエンドポイントの場合、アプリケーションが最初に発行されたデバイストークンを保存し、アプリケーションの起動時にそのデバイストークンを使用してプラットフォーム作成エンドポイントを呼び出すことが最善であると考える場合があります。これは、アプリケーションがデバイストークンの状態を管理する必要がなくなり、Amazon SNS はデバイストークンを最新の値に自動的に更新するため、正しいように思えるかもしれません。しかし、この解決策には多くの深刻な問題があります。

  • Amazon SNS は、 からのフィードバックに基づいてFCM、期限切れのデバイストークンを新しいデバイストークンに更新します。FCM は、古いデバイストークンに関する情報を一定期間保持しますが、無期限に保持しません。古いデバイストークンと新しいデバイストークン間の接続FCMを忘れると、Amazon はプラットフォームエンドポイントに保存されているデバイストークンを正しい値に更新SNSできなくなります。代わりにプラットフォームエンドポイントを無効にします。

  • プラットフォームアプリケーションには、同じデバイストークンに対応する複数のプラットフォームエンドポイントが含められます。

  • Amazon は、同じデバイストークンから作成できるプラットフォームエンドポイントの数にクォータをSNS課します。最終的に、新しいエンドポイントの作成は無効なパラメータの例外によって失敗し、「This endpoint is already registered with a different token.」 というエラーメッセージが表示されます。

FCM エンドポイントの管理の詳細については、「」を参照してくださいFirebase Cloud Messaging エンドポイントの Amazon SNS管理

無効なデバイストークンに関連付けられたプラットフォームエンドポイントを再度有効にする

モバイルプラットフォーム ( APNsや などFCM) SNSが、公開リクエストで使用されるデバイストークンが無効であることを Amazon に通知すると、Amazon はそのデバイストークンに関連付けられたプラットフォームエンドポイントをSNS無効にします。その後、Amazon SNSはそのデバイストークンへの後続の発行を拒否します。プラットフォームエンドポイントを再度に有効にして発行を継続すれば最適と思うかもしれませんが、ほとんどの場合これはうまくいきません。発行されるメッセージは配信されず、プラットフォームエンドポイントはその後まもなく無効になります。

これは、プラットフォームエンドポイントに関連付けられたデバイストークンが間違いなく無効であるためです。プラットフォームエンドポイントは、インストールされているどのアプリケーションにも応答しないため、配信が成功することはありません。次に に発行されると、モバイルプラットフォームはデバイストークンが無効SNSであることを再び Amazon に通知し、Amazon SNS は再びプラットフォームエンドポイントを無効にします。

無効なプラットフォームエンドポイントを再度有効にするには、有効なデバイストークンに関連付けた後 (エンドポイント属性の設定アクションを呼び出して)、有効にする必要があります。その場合のみ、そのプラットフォームエンドポイントへの配信は正常に行われます。デバイストークンを更新しないでプラットフォームエンドポイントを有効にできるのは、そのエンドポイントに関連付けられたデバイストークンが無効であったが、再度有効となった場合のみです。これは、例えばアプリケーションがアンインストールされて同じモバイルデバイスに再インストールされ、同じデバイストークンを受け取った場合などに発生します。上に示したアプローチではこれが行われます。関連付けられたデバイストークンが使用可能な最新のものであると確認してから、プラットフォームエンドポイントを再度有効にすることのみ確実に行ってください。