プラットフォーム・エンドポイントを作成し、 デバイストークン - Amazon Simple Notification Service

英語の翻訳が提供されている場合で、内容が矛盾する場合には、英語版がオリジナルとして取り扱われます。翻訳は機械翻訳により提供されています。

プラットフォーム・エンドポイントを作成し、 デバイストークン

アプリとモバイルデバイスがプッシュ通知サービスに登録されると、 プッシュ通知サービスはデバイストークンを返します。 Amazon SNS デバイス・トークンを使用して ダイレクトプッシュ通知を送信できるモバイルエンドポイントを作成する メッセージ。詳細については、以下を参照してください。 の前提条件 Amazon SNS ユーザー 通知 および ユーザー通知プロセスの概要.

このセクションでは、プラットフォームの作成に推奨されるアプローチについて説明します。 エンドポイントおよびデバイストークンの管理

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

でアプリに通知をプッシュするには Amazon SNS、そのアプリのデバイストークンは に最初に登録 Amazon SNS プラットフォームエンドポイントの作成を呼び出して アクション。このアクションは、プラットフォームの Amazon リソース名 (ARN) を使用します。 アプリケーションとデバイス トークンをパラメータとして指定し、 プラットフォームエンドポイントを作成しました。

プラットフォームエンドポイントの作成アクションは、次の操作を実行します。

  • プラットフォームエンドポイントがすでに存在する場合は、作成しないでください。 もう一度。既存のプラットフォームの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 (get endpoint attributes shows the endpoint as disabled) call set endpoint attributes to set the latest device token and then enable the platform endpoint endif endif

このアプローチは、アプリが登録したいときや、 再登録してください。通知時にも使用できます。 Amazon SNS デバイスの トークンの変更。この場合、最新の デバイストークン値。このアプローチについて注意すべき点は次のとおりです。

  • Create platform endpoint を呼び出す場合が 2 つあります。 アクション。アプリが 独自のプラットフォームエンドポイントARNを知らない。 初回登録。初期取得が エンドポイント属性アクション呼び出しは、 アプリケーションがエンドポイントARNを知っているが、 が削除されました。

  • エンドポイント属性の取得アクションは、 プラットフォームエンドポイントが単に が作成されました。これは、プラットフォームエンドポイントがすでに存在するが、 は無効になっています。この場合、プラットフォームの作成エンドポイントアクションは は成功しますが、プラットフォームエンドポイントは有効化されないため、 返却前にプラットフォームエンドポイントの状態を再確認してください 成功を導きます。

AWS SDK(SDK) 例

以下の例は、以前の疑似コードの実装方法を示しています。 使用 Amazon SNS のクライアントから提供される AWS SDK。

注記

SDK を使用する前に、必ず AWS の認証情報を設定してください。詳細については、AWS SDK for .NET 開発者ガイドまたは AWS SDK for Java V2 開発者ガイドを参照してください。

AWS SDK for Java

これは、以前の疑似コードの実装です。 Java:

class RegistrationExample { AmazonSNSClient client = new AmazonSNSClient(); //provide credentials here String arnStorage = null; public void registerWithSNS() { String endpointArn = retrieveEndpointArn(); String token = "Retrieved from the mobile operating system"; boolean updateNeeded = false; boolean createNeeded = (null == endpointArn); if (createNeeded) { // No platform endpoint ARN is stored; need to call createEndpoint. endpointArn = createEndpoint(); createNeeded = false; } System.out.println("Retrieving platform endpoint data..."); // Look up the platform endpoint and make sure the data in it is current, even if // it was just created. try { GetEndpointAttributesRequest geaReq = new GetEndpointAttributesRequest() .withEndpointArn(endpointArn); GetEndpointAttributesResult geaRes = client.getEndpointAttributes(geaReq); updateNeeded = !geaRes.getAttributes().get("Token").equals(token) || !geaRes.getAttributes().get("Enabled").equalsIgnoreCase("true"); } catch (NotFoundException nfe) { // We had a stored ARN, but the platform endpoint associated with it // disappeared. Recreate it. createNeeded = true; } if (createNeeded) { createEndpoint(token); } System.out.println("updateNeeded = " + updateNeeded); if (updateNeeded) { // The platform endpoint is out of sync with the current data; // update the token and enable it. System.out.println("Updating platform endpoint " + endpointArn); Map attribs = new HashMap(); attribs.put("Token", token); attribs.put("Enabled", "true"); SetEndpointAttributesRequest saeReq = new SetEndpointAttributesRequest() .withEndpointArn(endpointArn) .withAttributes(attribs); client.setEndpointAttributes(saeReq); } } /** * @return never null * */ private String createEndpoint(String token) { String endpointArn = null; try { System.out.println("Creating platform endpoint with token " + token); CreatePlatformEndpointRequest cpeReq = new CreatePlatformEndpointRequest() .withPlatformApplicationArn(applicationArn) .withToken(token); CreatePlatformEndpointResult cpeRes = client .createPlatformEndpoint(cpeReq); endpointArn = cpeRes.getEndpointArn(); } catch (InvalidParameterException ipe) { String message = ipe.getErrorMessage(); System.out.println("Exception message: " + message); Pattern p = Pattern .compile(".*Endpoint (arn:aws:sns[^ ]+) already exists " + "with the same [Tt]oken.*"); Matcher m = p.matcher(message); if (m.matches()) { // The platform endpoint already exists for this token, but with // additional custom data that // createEndpoint doesn't want to overwrite. Just use the // existing platform endpoint. endpointArn = m.group(1); } else { // Rethrow the exception, the input is actually bad. throw ipe; } } storeEndpointArn(endpointArn); return endpointArn; } /** * @return the ARN the app was registered under previously, or null if no * platform endpoint ARN is stored. */ private String retrieveEndpointArn() { // Retrieve the platform endpoint ARN from permanent storage, // or return null if null is stored. return arnStorage; } /** * Stores the platform endpoint ARN in permanent storage for lookup next time. * */ private void storeEndpointArn(String endpointArn) { // Write the platform endpoint ARN to permanent storage. arnStorage = endpointArn; } }

この実装について注目すべき点は、 の InvalidParameterException は、 createEndpoint メソッド。 Amazon SNS 却下 作成 既存のプラットフォームエンドポイントが 同じデバイストークンを持ち、Nullでない CustomUserData というのも、代替案が は、 CustomUserData。 は createEndpoint 前のコードのメソッドは、 InvalidParameterException 投げる Amazon SNS, この特定の理由でスローされたかどうかを確認し、 既存のプラットフォームエンドポイントのARNを 例外。これは成功します。なぜなら、プラットフォームエンドポイントは 正しいデバイストークンが存在します。

詳細については、以下を参照してください。 使用 Amazon SNS モバイルプッシュAPI.

AWS SDK for .NET

これは、以前の疑似コードの実装です。 C#:

class RegistrationExample { private AmazonSimpleNotificationServiceClient client = new AmazonSimpleNotificationServiceClient(); private String arnStorage = null; public void RegisterWithSNS() { String endpointArn = EndpointArn; String token = "Retrieved from the mobile operating system"; String applicationArn = "Set this based on your application"; bool updateNeeded = false; bool createNeeded = (null == endpointArn); if (createNeeded) { // No platform endpoint ARN is stored; need to call createEndpoint. EndpointArn = CreateEndpoint(token, applicationArn); createNeeded = false; } Console.WriteLine("Retrieving platform endpoint data..."); // Look up the platform endpoint and make sure the data in it is current, even if // it was just created. try { GetEndpointAttributesRequest geaReq = new GetEndpointAttributesRequest(); geaReq.EndpointArn = EndpointArn; GetEndpointAttributesResponse geaRes = client.GetEndpointAttributes(geaReq); updateNeeded = !(geaRes.Attributes["Token"] == token) || !(geaRes.Attributes["Enabled"] == "true"); } catch (NotFoundException) { // We had a stored ARN, but the platform endpoint associated with it // disappeared. Recreate it. createNeeded = true; } if (createNeeded) { CreateEndpoint(token, applicationArn); } Console.WriteLine("updateNeeded = " + updateNeeded); if (updateNeeded) { // The platform endpoint is out of sync with the current data; // update the token and enable it. Console.WriteLine("Updating platform endpoint " + endpointArn); Dictionary<String,String> attribs = new Dictionary<String,String>(); attribs["Token"] = token; attribs["Enabled"] = "true"; SetEndpointAttributesRequest saeReq = new SetEndpointAttributesRequest(); saeReq.EndpointArn = EndpointArn; saeReq.Attributes = attribs; client.SetEndpointAttributes(saeReq); } } private String CreateEndpoint(String token, String applicationArn) { String endpointArn = null; try { Console.WriteLine("Creating platform endpoint with token " + token); CreatePlatformEndpointRequest cpeReq = new CreatePlatformEndpointRequest(); cpeReq.PlatformApplicationArn = applicationArn; cpeReq.Token = token; CreatePlatformEndpointResponse cpeRes = client.CreatePlatformEndpoint(cpeReq); endpointArn = cpeRes.EndpointArn; } catch (InvalidParameterException ipe) { String message = ipe.Message; Console.WriteLine("Exception message: " + message); Regex rgx = new Regex(".*Endpoint (arn:aws:sns[^ ]+) already exists with the same [Tt]oken.*", RegexOptions.IgnoreCase); MatchCollection m = rgx.Matches(message); if (m.Count > 0 && m[0].Groups.Count > 1) { // The platform endpoint already exists for this token, but with // additional custom data that createEndpoint doesn't want to overwrite. // Just use the existing platform endpoint. endpointArn = m[0].Groups[1].Value; } else { // Rethrow the exception, the input is actually bad. throw ipe; } } EndpointArn = endpointArn; return endpointArn; } // Get/Set arn public String EndpointArn { get { return arnStorage; } set { arnStorage = value; } } }

詳細については、以下を参照してください。 使用 Amazon SNS モバイルプッシュAPI.

Troubleshooting

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

特に FCM エンドポイントを保管しておくのがベストだと考えるかもしれません。 アプリケーションが発行される最初のデバイス・トークンを発行してから、作成 アプリケーション上でそのデバイストークンを使用するプラットフォームエンドポイント 起動。アプリが デバイス・トークンの状態を管理し、 Amazon SNS 自動的に更新され デバイス・トークンを最新の値に設定します。ただし、このソリューションには 重大な問題の数:

  • Amazon SNS のフィードバックに頼る FCM 期限切れのデバイスを更新する トークンを新しいデバイス トークンに交換できます。 FCM 古い情報を保持 デバイス・トークンを一定期間使用する必要がありますが、無期限に使用することはできません。1回 FCM 古いデバイストークンと 新しいデバイストークン、 Amazon SNS は今後、 正しいデバイストークンがプラットフォームエンドポイントに格納されている プラットフォームエンドポイントを無効にするだけです。 その代わりに、

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

  • Amazon SNS は、プラットフォームエンドポイントの数にクォータを課します。 は、同じデバイス・トークンから作成することができます。最終的には 新しいエンドポイントの作成は、無効な パラメータ例外と次のエラー メッセージ: "この エンドポイントは別のトークンで既に登録されています。"

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

モバイルプラットフォーム(例: APNs または FCM) 通知 Amazon SNS 私達は パブリッシュリクエストで使用されたデバイストークンが無効です。 Amazon SNS 無効 そのデバイストークンに関連付けられたプラットフォームエンドポイント。 Amazon SNS 次に そのデバイストークンへの後続の発行を拒否します。思っているかもしれませんが プラットフォームエンドポイントを再度有効にし、公開を続けるのが最善です。 大半の状況では、これは機能しません。 プラットフォームエンドポイントが すぐに無効になります。

これは、プラットフォームエンドポイントに関連付けられたデバイストークンが は、真に無効です。配達が成功しないのは、 は、インストールされているすべてのアプリに対応します。次回公開する時 モバイルプラットフォームが Amazon SNS デバイストークンが 無効、および Amazon SNS プラットフォームエンドポイントを再度無効にします。

無効なプラットフォームエンドポイントを再度有効にするには、関連付ける必要があります 有効なデバイストークン(エンドポイント属性アクションコールを設定) 有効にします。そのプラットフォームエンドポイントに配信されます 成功します プラットフォームエンドポイントを デバイス・トークンの更新は、デバイス・トークンが関連付けられているときに機能します。 そのエンドポイントは、以前は無効でしたが、その後再び有効になりました。これは たとえば、アプリがアンインストールされ、 同じモバイルデバイスに再インストールされ、同じデバイスを受信する トークン。上に示したアプローチは、これを行うものであり、 デバイストークンが 関連しています。