

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

# Amazon SNS でのモバイルアプリのセットアップ
<a name="mobile-push-send"></a>

このトピックでは、[Amazon SNS ユーザー通知の前提条件](sns-prerequisites-for-mobile-push-notifications.md) で説明されている情報を使用して、AWS マネジメントコンソール でモバイルアプリケーションをセットアップする方法について説明します。

# Amazon SNS ユーザー通知の前提条件
<a name="sns-prerequisites-for-mobile-push-notifications"></a>

Amazon SNS モバイルプッシュ通知の使用を開始するには、以下が必要です。
+ サポートされているプッシュ通知サービスのいずれかに接続するための認証情報セット: ADM、APN、Baidu、FCM、MPNSまたは WNS。
+ モバイルアプリケーションやデバイスのデバイストークンまたは登録 ID。
+ モバイルエンドポイントにプッシュ通知メッセージを送信するように設定された Amazon SNS。
+ 登録済みで、サポートされているいずれかのプッシュ通知サービスを使用するように設定されたモバイルアプリケーション。

アプリケーションをプッシュ通知サービスに登録するには、いくつかのステップが必要です。Amazon SNS では、モバイルエンドポイントに直接プッシュ通知メッセージを送信するために、ユーザーがプッシュ通知サービスに対して指定する情報の一部が必要です。一般的に、プッシュ通知サービスに接続するための必須認証情報、プッシュ通知サービスから受け取ったデバイストークンまたは登録 ID(モバイルデバイスおよびモバイルアプリケーションを表すもの)、およびプッシュ通知サービスに登録されているモバイルアプリケーションが必要です。

認証情報の正確な形式はモバイルプラットフォームごとに異なりますが、どの場合も、これらの認証情報はプラットフォームに接続するときに送信する必要があります。モバイルアプリケーションごとに 1 つの認証情報セットが発行され、そのアプリケーションのどのインスタンスにメッセージを送信する際もその認証情報セットを使用する必要があります。

具体的な名前は、どのプッシュ通知サービスが使用されるかによって異なります。例えば、プッシュ通知サービスとして APN を使用する場合は、*デバイストークン*が必要になります。また、FCM を使用する場合は、デバイストークンに相当するものが*登録 ID *と呼ばれます。*デバイストークン*または*登録 ID* は、モバイルデバイスのオペレーティングシステムによってアプリケーションに送信される文字列です。特定のモバイルデバイスで実行されるモバイルアプリケーションのインスタンスを一意に識別するため、このアプリケーション/デバイスペアの一意識別子と考えることができます。

Amazon SNS は、認証情報 (および他のいくつかの設定) をプラットフォームアプリケーションリソースとして保存します。デバイストークン (ここでもいくつかの追加設定を使用) は、*プラットフォームエンドポイント*と呼ばれるオブジェクトとして表現されます。各プラットフォームエンドポイントは、1 つの特定のプラットフォームアプリケーションに属し、対応するプラットフォームアプリケーションに保存された認証情報を使用してすべてのプラットフォームエンドポイントに通信できます。

以降のセクションでは、サポートされているプッシュ通知サービスごとの前提条件が示されています。前提条件情報を取得したら、 AWS マネジメントコンソール または Amazon SNS モバイルプッシュ APIs を使用してプッシュ通知メッセージを送信できます。詳細については、「[Amazon SNS でプッシュ通知を設定する](sns-mobile-application-as-subscriber.md#sns-user-notifications-process-overview)」を参照してください。

# Amazon SNS プラットフォームアプリケーションの作成
<a name="mobile-push-send-register"></a>

Amazon SNS からモバイルエンドポイントへ通知を送信するには、直接送信する場合でも、トピックへのサブスクリプションを介して送信する場合でも、最初にプラットフォームアプリケーションを作成する必要があります。アプリを AWS に登録したら、そのアプリとモバイルデバイスの両方についてエンドポイントを作成する必要があります。このエンドポイントにより、Amazon SNS はデバイスにメッセージを送信できます。

**プラットフォームアプリケーションを作成するには**

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションペインで、**[プッシュ通知]** を選択します。

1. **[Platform applications]** (プラットフォームアプリケーション) セクションで、**[Create platform application]** (プラットフォームアプリケーションの作成) を選択します。

1. を選択します。。**AWS リージョン**モバイルアプリケーションを作成できる AWS リージョンのリストについては、「[Amazon SNS モバイルアプリケーションでサポートされるリージョン](sns-mobile-push-supported-regions.md)」を参照してください。

1. 次の**アプリケーションの詳細**を入力します。
   + **アプリケーション名** – プラットフォームアプリケーションの**名前**を指定します。この名前は、1～256 文字の範囲で指定する必要があり、大文字/小文字のアルファベット、数字、アンダースコア、ハイフン、およびピリオドを含めることができます。
   + **プッシュ通知プラットフォーム** – アプリが登録されている適切な**通知サービス**を選択します (Apple Push Notification Service (APNs)、Firebase Cloud Messaging (FCM) など)。

1. 選択したプラットフォームに応じて、特定の認証情報を指定する必要があります。
   + **APNs** (Apple Push Notification Service) の場合 – **トークンベース**の認証または**証明書ベース**の認証のいずれかを選択します。
     + トークンベースの認証の場合は、**.p8 ファイル** (キーチェーンアクセスを介して生成されます) をアップロードします。
     + 証明書ベースの認証の場合は、**.p12 ファイル** (キーチェーンアクセスからエクスポートされます) をアップロードします。
   + **FCM** (Firebase Cloud Messaging) の場合 – Firebase コンソールの**サーバーキー**を入力します。
   + **他のプラットフォーム** (ADM や GCM など) の場合 – それぞれの **API キー**または**認証情報**を入力します。

1. 必要な詳細を入力したら、**[プラットフォームアプリケーションの作成]**を選択します。このアクションは、アプリを Amazon SNS に登録し、対応するプラットフォームアプリケーションオブジェクトを作成します。

1. 作成時に、Amazon SNS は [https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html) (Amazon リソースネーム) を生成して返します。この ARN はプラットフォームアプリケーションを一意に識別するもので、モバイルデバイスのエンドポイントを作成するときに使用されます。

# モバイル通知用の Amazon SNS プラットフォームエンドポイントの設定
<a name="mobile-platform-endpoint"></a>

アプリやモバイルデバイスをプッシュ通知サービス（APNs や Firebase Cloud Messaging など）に登録するとき、プッシュ通知サービスはデバイストークンを返します。Amazon SNS はこのデバイストークンを使用してプラットフォームエンドポイントを作成します。プラットフォームエンドポイントは、直接プッシュ通知メッセージをデバイス上のアプリに送信するためのターゲットとして機能します。プラットフォームエンドポイントはブリッジとして機能し、Amazon SNS からプッシュ通知サービスに送信されるメッセージをルーティングして、対応するモバイルデバイスに配信します。詳細については、「[Amazon SNS ユーザー通知の前提条件](sns-prerequisites-for-mobile-push-notifications.md)」および「[Amazon SNS でプッシュ通知を設定する](sns-mobile-application-as-subscriber.md#sns-user-notifications-process-overview)」を参照してください。

## デバイストークンとプラットフォームエンドポイントについて
<a name="device-token-platform-endpoint"></a>

デバイストークンは、プッシュ通知サービス (APNs、Firebase Cloud Messaging など) に登録されたモバイルデバイスを一意に識別します。アプリをプッシュ通知サービスに登録するとき、そのアプリとデバイスに固有のデバイストークンが生成されます。Amazon SNS はこのデバイストークンを使用して、対応するプラットフォームアプリケーション内にプラットフォームエンドポイントを作成します。

プラットフォームエンドポイントによって、Amazon SNS はプッシュ通知サービスを介してデバイスにプッシュ通知メッセージを送信でき、その際にアプリとユーザーのデバイス間の接続を維持することができます。

## プラットフォームエンドポイントの作成
<a name="mobile-platform-endpoint-create"></a>

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

[https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html) アクションでは、次の処理が行われます。
+ プラットフォームエンドポイントが既に存在する場合、再度作成しないでください。呼び出し元に既存のプラットフォームエンドポイントの ARN を返します。
+ デバイストークンが同じだが設定が異なるプラットフォームエンドポイントが既に存在する場合、再度作成しないでください。呼び出し元に例外をスローします。
+ プラットフォームエンドポイントが存在しない場合は、作成します。呼び出し元に新しく作成したプラットフォームエンドポイントの ARN を返します。

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

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

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

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

## 擬似コード
<a name="mobile-platform-endpoint-pseudo-code"></a>

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

```
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
```

このアプローチは、アプリケーションが自身を登録または再登録するときいつでも使用できます。また、デバイストークンの変更について Amazon SNS に通知するときも使用できます。この場合、最新のデバイストークン値を持つアクションを呼び出すだけです。このアプローチについて注意が必要な点は次のとおりです。
+ プラットフォームエンドポイントの作成アクションの呼び出しが考えられる 2 つのケースがあります。アプリケーションが自身のプラットフォームエンドポイント ARN を認識していない、ごく最初の時点で呼び出される可能性があります。これは初回登録時に発生します。さらに、最初の `GetEndpointAttributes` アクションが not-found 例外で失敗した場合にも呼び出されます。これは、アプリケーションがエンドポイント ARN を認識しているが、削除された場合に発生する可能性があります。
+ `GetEndpointAttributes` アクションは、プラットフォームエンドポイントが作成されたばかりの場合でもプラットフォームエンドポイントの状態を確認するために呼び出されます。これは、プラットフォームエンドポイントが既に存在するが無効になっている場合に発生します。この場合、プラットフォームエンドポイントの作成アクションが成功しますが、プラットフォームエンドポイントは有効にならないため、成功を返す前にプラットフォームエンドポイントの状態をもう一度確認する必要があります。

## AWS SDK の例
<a name="mobile-platform-endpoint-sdk-examples"></a>

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

 AWS SDK を使用するには、認証情報を使用して設定する必要があります。詳細については、「*AWS SDK とツールのリファレンスガイド*」の「[共有設定ファイルと認証情報ファイル](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html)」を参照してください。

------
#### [ 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 コード例リポジトリ](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/javav2/example_code/sns#code-examples)での設定と実行の方法を確認してください。

```
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 アクション](mobile-push-api.md)」を参照してください。

## トラブルシューティング
<a name="mobile-platform-endpoint-problems"></a>

### 古いデバイストークンを使用してプラットフォームエンドポイントの作成を繰り返し呼び出す
<a name="mobile-platform-endpoint-problems-outdated"></a>

特に FCM エンドポイントの場合、アプリケーションを発行した最初のデバイストークンを保存してから、アプリケーションが起動するたびにそのデバイストークンを使用してプラットフォームエンドポイントの作成を呼び出すのが最適に思えるかもしれません。これは、アプリケーションがデバイストークンの状態を管理する必要がなくなり、Amazon SNS がサービストークンを最新の値に自動的に更新するため、適切に思えるかもしれません。しかし、この解決策には多くの深刻な問題があります。
+ Amazon SNS は、有効期限切れのデバイストークンを新しいデバイストークンに更新するために FCM からのフィードバックが必要です。FCM は、古いデバイストークンの情報を当分の間保持しますが、無期限に保持するわけではありません。FCM が古いデバイストークンと新しいデバイストークンの関連性の認識を失うと、Amazon SNS はプラットフォームエンドポイントに保存されたデバイストークンを適切な値に更新することができなくなります。代わりに、プラットフォームエンドポイントが無効になるだけです。
+ プラットフォームアプリケーションには、同じデバイストークンに対応する複数のプラットフォームエンドポイントが含められます。
+ Amazon SNS では、同じデバイストークンを使用して作成できるプラットフォームエンドポイントの数に限度が適用されます。最終的に、新しいエンドポイントの作成は無効なパラメータの例外によって失敗し、「This endpoint is already registered with a different token.」 というエラーメッセージが表示されます。

FCM エンドポイントの管理の詳細については、「[Amazon SNS の Firebase Cloud Messaging エンドポイントの管理](sns-fcm-endpoint-management.md)」を参照してください。

### 無効なデバイストークンに関連付けられたプラットフォームエンドポイントを再度有効にする
<a name="mobile-platform-endpoint-problems-invalid"></a>

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

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

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

# モバイル通知用のデバイストークンと Amazon SNS の統合
<a name="mobile-push-send-devicetoken"></a>

Apple Push Notification Service (APNs) や Firebase Cloud Messaging (FCM) などの通知サービスに初めてアプリケーションやモバイルデバイスを登録すると、それらサービスからデバイストークンまたは登録 ID が返されます。これらのトークンや ID は Amazon SNS に追加され、[https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_PlatformApplication.html) API を使用して、アプリやデバイス向けのエンドポイントが作成されます。エンドポイントが作成されると、[https://docs.aws.amazon.com/sns/latest/api/API_Endpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_Endpoint.html) が返されます。Amazon SNS はこれを使用して、通知を適切なアプリケーションやデバイスに送信します。

次の方法を使用して、デバイストークンや登録 ID を Amazon SNS に追加できます。
+ を介して 1 つのトークンを手動で追加する AWS マネジメントコンソール
+ [https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html) API を使用して複数のトークンをアップロードする
+ 今後のデバイスのトークンを登録する

****デバイストークンまたは登録 ID を手動で追加するには****

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションペインで、**[プッシュ通知]** を選択します。

1. **[プラットフォームアプリケーション]** セクションでアプリケーションを選択し、**[編集]** を選択します。プラットフォームアプリケーションをまだ作成していない場合は、「Amazon SNS プラットフォームアプリケーションの作成」[Amazon SNS プラットフォームアプリケーションの作成](mobile-push-send-register.md)ガイドに従って今すぐ作成してください。

1. **エンドポイントの作成** を選択します。

1. 使用している通知サービスに応じて、**[エンドポイントトークン]** ボックスに**トークン**または**登録 ID** を入力します (例: FCM 登録 ID)。

1. (オプション) **[ユーザーデータ]** フィールドに追加のデータを入力します。このデータは UTF-8 でエンコードされ、2 KB 未満である必要があります。

1. **エンドポイントの作成** を選択します。

エンドポイントが作成されると、そのエンドポイントの対象となるモバイルデバイス、またはAmazon SNS トピックにサブスクライブされているモバイルデバイスにメッセージを直接送信することができます。

****`CreatePlatformEndpoint` API を使用して複数のトークンをアップロードするには****

次の手順は、 が提供するサンプル Java アプリ (`bulkupload` パッケージ) を使用して AWS 、複数のトークン (デバイストークンまたは登録 IDs) を Amazon SNS にアップロードする方法を示しています。既存のトークンのアップロードを開始するには、このサンプルアプリを使用できます。
**注記**  
以下の手順では、Eclipse Java IDE を使用します。この手順では、 をインストール AWS SDK for Java し、 AWS のセキュリティ認証情報があることを前提としています AWS アカウント。詳細については、「[AWS SDK for Java](https://aws.amazon.com/sdkforjava/)」を参照してください。認証情報の詳細については、「*IAM ユーザーガイド*」の「[AWS セキュリティ認証情報](https://docs.aws.amazon.com/general/latest/gr/getting-aws-sec-creds.html)」を参照してください。

1. [snsmobilepush.zip](samples/snsmobilepush.zip) ファイルをダウンロードして解凍します。

1. Eclipse で新しい **Java プロジェクト**を作成し、`SNSSamples` フォルダをプロジェクトにインポートします。

1. [OpenCSV library](http://sourceforge.net/projects/opencsv/) をダウンロードし、ビルドパスに追加します。

1. `BulkUpload.properties` ファイルで、次のように指定します。
   + `ApplicationArn` (プラットフォームアプリケーション ARN)。
   + トークンを含む CSV ファイルへの絶対パス。
   + 成功したトークンと失敗したトークンのログファイル名。例えば、`goodTokens.csv` と `badTokens.csv` です。
   + (オプション) 区切り文字、引用符文字、使用するスレッドの数の設定。

   完了した `BulkUpload.properties` は次のようになります。

   ```
   applicationarn: arn:aws:sns:us-west-2:111122223333:app/FCM/fcmpushapp
   csvfilename: C:\\mytokendirectory\\mytokens.csv
   goodfilename: C:\\mylogfiles\\goodtokens.csv
   badfilename: C:\\mylogfiles\\badtokens.csv
   delimiterchar: ','
   quotechar: '"'
   numofthreads: 5
   ```

1.  **BatchCreatePlatformEndpointSample.java** アプリケーションを実行してトークンを Amazon SNS にアップロードします。正常にアップロードされたトークンは `goodTokens.csv` に記録され、不正な形式のトークンは `badTokens.csv` に記録されます。

**今後のアプリケーションインストールのためにデバイスからトークンを登録するには**

このプロセスには 2 つのオプションがあります。

**Amazon Cognito サービスを使用する**  
モバイルアプリは、一時的なセキュリティ認証情報を使用してエンドポイントを作成できます。一時的な認証情報を生成するには、Amazon Cognito をお勧めします。詳細については、「*[Amazon Cognito デベロッパーガイド](https://docs.aws.amazon.com/cognito/latest/developerguide/)*」を参照してください。  
アプリの[登録](application-event-notifications.md)を追跡するには、Amazon SNS イベントを使用して、新しいエンドポイント ARNsの作成時に通知を受信します。  
また、[https://docs.aws.amazon.com/sns/latest/api/API_ListEndpointsByPlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_ListEndpointsByPlatformApplication.html) API を使用して、登録されたエンドポイントのリストを取得することもできます。

**プロキシサーバーの使用**  
アプリケーションのインフラストラクチャがインストール時のデバイス登録を既にサポートしている場合は、お使いのサーバーをプロキシとして使用できます。デバイストークンは [https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformEndpoint.html) API を介して Amazon SNS に転送されます。  
Amazon SNS によって作成されたエンドポイント ARN が返され、今後のメッセージを発行するためにサーバーで保存できます。

# Amazon SNS Apple プッシュ通知認証方法
<a name="sns-apple-authentication-methods"></a>

アプリのデベロッパーであることを識別する情報を提供することで、Amazon SNS に iOS または macOS アプリへのプッシュ通知の送信を許可できます。認証するには、[プラットフォームアプリケーションを作成するとき](https://docs.aws.amazon.com/sns/latest/api/API_SetPlatformApplicationAttributes.html)に*キー*または*証明書* のいずれかを提供します。どちらも Apple Developer アカウントから取得できます。

**トークン署名キー**  
Amazon SNS が Apple Push Notification Service (APN) 認証トークンの署名に使用するプライベート署名キー。  
署名キーを提供する場合、Amazon SNS はトークンを使用して、送信するプッシュ通知ごとに APN を使用して認証を行います。署名キーを使用すると、APN 本番環境とサンドボックス環境に通知を送信できます。  
署名キーの有効期限は失効しないため、複数のアプリに対して同じ署名キーを使用できます。詳しくは、Apple ウェブサイトの **デベロッパーアカウントヘルプ** セクションの[認証トークンを使用した APN との通信](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_token-based_connection_to_apns)を参照してください。

**証明書**  
プッシュ通知を送信するときに Amazon SNS が APN と認証するために使用する TLS 証明書です。証明書は Apple デベロッパーアカウントから取得できます。  
証明書は 1 年後に失効します。この場合、新しい証明書を作成し、それを Amazon SNS に提供する必要があります。詳細については、Apple デベロッパーウェブサイトの「[APN への証明書ベースの接続の確立](https://developer.apple.com/documentation/usernotifications/setting_up_a_remote_notification_server/establishing_a_certificate-based_connection_to_apns)」を参照してください。

**AWS マネジメントコンソールを使用して APNs 設定を管理するには**

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションペインで、**[プッシュ通知]** を選択します。

1. **[プラットフォームアプリケーション]** セクションで、APNs の設定を編集する**アプリケーション**を選択し、**[編集]** を選択します。プラットフォームアプリケーションをまだ作成していない場合は、「Amazon SNS プラットフォームアプリケーションの作成」[Amazon SNS プラットフォームアプリケーションの作成](mobile-push-send-register.md)ガイドに従って今すぐ作成してください。

1. **[編集]** を選択して、プラットフォームアプリケーションの設定を変更します。

1. **[認証タイプ]** セクションで、次のいずれかのオプションを選択します。
   + **トークンベースの認証** (最新の APNs 統合に推奨)
   + **証明書ベースの認証** (従来の方法)

1. 認証タイプに基づいて**認証情報**を設定します。
   + **トークンベースの認証の場合:**
     + Apple デベロッパーアカウントからダウンロードした認証トークン署名キーである **.p8 ファイル**をアップロードします。
     + Apple デベロッパーアカウントで確認できる**署名キー ID** を入力します。**[証明書]**、**[ID とプロファイル]**、**[キー]** の順に移動し、使用する**キー**を選択します。
     + Apple デベロッパーアカウントの**チーム識別子** を指定します。この識別子は、[メンバーシップ] ページで確認できます。
     + アプリに割り当てられた**バンドル識別子**を入力します。この識別子は、[証明書]、[ID とプロファイル]、[アプリ ID] で確認できます。
   + **証明書ベースの認証の場合:**
     + TLS 証明書の **.p12 ファイル**をアップロードします。このファイルは、Apple デベロッパーアカウントから証明書をダウンロードした後で、macOS のキーチェーンアクセスからエクスポートできます。
     + **パスワード**を p12 証明書に割り当てている場合は、そのパスワードをここに入力します。

1. 必要な認証情報を入力したら、**[変更の保存]** を選択して設定を更新します。

# Amazon SNS と Firebase Cloud Messaging の認証設定の統合
<a name="sns-fcm-authentication-methods"></a>

このトピックでは、 AWS API および で使用するために必要な FCM API (HTTP v1) 認証情報を Google から取得する方法について説明します AWS CLI AWS マネジメントコンソール。

**重要**  
2024 年 3 月 26 日、Amazon SNS は、Apple デバイスと Webpush 送信先用の FCM HTTP v1 API をサポートします。アプリケーションの中断を避けるため、2024 年 6 月 1 日またはそれ以前に、既存のモバイルプッシュアプリケーションを最新の FCM HTTP v1 API に移行することをお勧めします。  
2024 年 1 月 18 日、Amazon SNS は、Android デバイスへのモバイルプッシュ通知配信用の FCM HTTP v1 API のサポートを導入しました。  
2023 年 6 月 20 日、Google は Firebase Cloud Messaging (FCM) のレガシー HTTP API を廃止しました。Amazon SNS は、FCM HTTP v1 API を使用したすべてのデバイスタイプへの配信をサポートするようになりました。中断を避けるため、2024 年 6 月 1 日またはそれ以前に、既存のモバイルプッシュアプリケーションを最新の FCM HTTP v1 API に移行することをお勧めします。

アプリケーションのデベロッパーであることを識別する情報を提供することで、Amazon SNS にアプリケーションへのプッシュ通知の送信を許可できます。認証するには、[プラットフォームアプリケーションの作成時](https://docs.aws.amazon.com/sns/latest/api/API_SetPlatformApplicationAttributes.html)に **API キー**または**トークン**のいずれかを指定します。次の情報は [Firebase アプリケーションコンソール](https://firebase.google.com/?gad=1&gclid=CjwKCAiA0syqBhBxEiwAeNx9N27M7zxHjlS74_gp4mAS4QTMQH5J35sTO29od-yauuq259zzX_I2DRoCrbsQAvD_BwE&gclsrc=aw.ds)から取得できます。

**API キー**  
API キーは Firebase のレガシー API を呼び出すときに使用される認証情報です。FCM レガシー API は 2024 年 6 月 20 日に Google によって廃止されます。現在 API キーをプラットフォーム認証情報として使用している場合は、オプションとして **[トークン]** を選択し、Firebase アプリケーションに関連する JSON ファイルをアップロードすることで、プラットフォーム認証情報を更新できます。

**Token**  
HTTP v1 API を呼び出す際には、有効期間の短いアクセストークンが使用されます。これは Firebase が推奨するプッシュ通知の送信用の API です。Firebase はアクセストークンを生成するために、プライベートキーファイル (service.json ファイルとも呼ばれます) の形式でデベロッパーに認証情報のセットを提供します。

## 前提条件
<a name="sns-fcm-authentication-prerequisite"></a>

Amazon SNS で FCM の設定の管理を開始する前に、FCM service.json 認証情報を取得する必要があります。service.json 認証情報を取得するには、Google Firebase ドキュメントの「[以前の HTTP から HTTP v1 に移行する](https://firebase.google.com/docs/cloud-messaging/migrate-v1)」を参照してください。

## CLI を使用した FCM の設定の管理
<a name="sns-fcm-authentication-api"></a>

 AWS API を使用して FCM プッシュ通知を作成できます。 AWS アカウント内の Amazon SNS リソースの数とサイズは限られています。詳細については、「*AWS 全般のリファレンス ガイド*」の「[Amazon Simple Notification Service のエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/sns.html)」を参照してください。

**Amazon SNS トピック (API) とともに FCM プッシュ通知を作成するにはAWS**  
**キー**認証情報を使用する場合、`PlatformCredential` は `API key` です。**トークン**認証情報を使用する場合、`PlatformCredential` は JSON 形式のプライベートキーファイルです。
+ [https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html](https://docs.aws.amazon.com/sns/latest/api/API_CreatePlatformApplication.html)

**既存の Amazon SNS トピックの FCM 認証情報タイプを取得するには (AWS API)**  
認証情報タイプ `"AuthenticationMethod": "Token"` または ` "AuthenticationMethod": "Key"` を取得します。
+ [GetPlatformApplicationAttributes](https://docs.aws.amazon.com/sns/latest/api/API_GetPlatformApplicationAttributes.html)

**既存の Amazon SNS トピックの FCM 属性を設定するには (AWS API)**  
FCM 属性を設定します。
+ [SetPlatformApplicationAttributes](https://docs.aws.amazon.com/sns/latest/api/API_SetPlatformApplicationAttributes.html)

## コンソールを使用して FCM の設定を管理する
<a name="sns-fcm-authentication-cli"></a>

( AWS Command Line Interface CLI) を使用して FCM プッシュ通知を作成できます。 AWS アカウント内の Amazon SNS リソースの数とサイズは限られています。詳細については、「[Amazon Simple Notification Service のエンドポイントとクォータ](https://docs.aws.amazon.com/general/latest/gr/sns.html)」を参照してください。

**Amazon SNS トピックと共に FCM プッシュ通知を作成するには (AWS CLI)**  
**キー**認証情報を使用する場合、`PlatformCredential` は `API key` です。**トークン**認証情報を使用する場合、`PlatformCredential` は JSON 形式のプライベートキーファイルです。 AWS CLI を使用する場合、ファイルは文字列形式であり、特殊文字は無視する必要があります。ファイルを正しくフォーマットするために、Amazon SNS では次のコマンドを使用することを推奨しています: `SERVICE_JSON=`jq @json <<< cat service.json``:
+ [create-platform-application](https://docs.aws.amazon.com/cli/latest/reference/sns/create-platform-application.html)

**既存の Amazon SNS トピックの FCM 認証情報タイプを取得するには (AWS CLI)**  
認証情報タイプ `"AuthenticationMethod": "Token"` または ` "AuthenticationMethod": "Key"` を取得します。
+ [get-platform-application-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/get-platform-application-attributes.html)

**既存の Amazon SNS トピックの FCM 属性を設定するには (AWS CLI)**  
FCM 属性を設定します。
+ [set-platform-application-attributes](https://docs.aws.amazon.com/cli/latest/reference/sns/set-platform-application-attributes.html)

## FCM の設定の管理 (コンソール)
<a name="sns-fcm-authentication-console"></a>

Amazon SNS で Firebase Cloud Messaging (FCM) 認証情報を入力および管理するには、次の手順を実行します。

1. [Amazon SNS コンソール](https://console.aws.amazon.com/sns/home)にサインインします。

1. ナビゲーションペインで、**[プッシュ通知]** を選択します。

1. **[プラットフォームアプリケーション]** セクションで、認証情報を編集する **FCM プラットフォームアプリケーション**を選択し、**[編集]**を選択します。

1. **[Firebase Cloud Messaging の認証情報]** セクションで、次のいずれかのオプションを選択します。
   + **トークンベースの認証** (推奨方法) – Firebase コンソールからダウンロードした**プライベートキーファイル** (JSON) をアップロードします。このファイルには、FCM 通知の有効期間の短いアクセストークンを生成するために必要な認証情報が含まれています。このファイルを取得するには、次を実行します。

     1. [Firebase アプリケーションコンソール](https://firebase.google.com/?gad=1&gclid=CjwKCAiA0syqBhBxEiwAeNx9N27M7zxHjlS74_gp4mAS4QTMQH5J35sTO29od-yauuq259zzX_I2DRoCrbsQAvD_BwE&gclsrc=aw.ds)に移動します。

     1. **[プロジェクト設定]**で、**[Cloud Messaging]** を選択します。

     1. **プライベートキー** JSON ファイルをダウンロードします (トークンベースの認証方法で使用)。
   + **API キー認証** – 古い API キー認証方法を使用する場合は、指定されたフィールドに **Google API キー**を入力します。このファイルを取得するには、次を実行します。

     1. [Firebase アプリケーションコンソール](https://firebase.google.com/?gad=1&gclid=CjwKCAiA0syqBhBxEiwAeNx9N27M7zxHjlS74_gp4mAS4QTMQH5J35sTO29od-yauuq259zzX_I2DRoCrbsQAvD_BwE&gclsrc=aw.ds)に移動します。

     1. **[プロジェクト設定]**で、**[Cloud Messaging]** を選択します。

     1. 通知の送信に使用する**サーバーキー** (API キー) をコピーします。

1. 変更が完了したら、[**変更の保存**] を選択します。

**関連トピック**
+ [Amazon SNS での Google Firebase Cloud Messaging v1 ペイロードの使用](sns-fcm-v1-payloads.md)

# Amazon SNS の Firebase Cloud Messaging エンドポイントの管理
<a name="sns-fcm-endpoint-management"></a>

## デバイストークンの管理と維持
<a name="sns-managing-device-tokens"></a>

以下の手順に従って、モバイルアプリケーションのプッシュ通知の配信可能性を確保できます。

1. すべてのデバイストークン、対応する Amazon SNS エンドポイントの ARN、タイムスタンプを、アプリケーションサーバーに保存します。

1. すべての古いトークンを削除し、対応する Amazon SNS エンドポイント ARN を削除します。

アプリの初回起動時に、デバイスのデバイストークン (登録トークンとも呼ばれます) を受け取ります。このデバイストークンは、デバイスのオペレーティングシステムによって作成され、FCM アプリケーションに関連付けられています。このデバイストークンを受け取ったら、プラットフォームエンドポイントとして Amazon SNS に登録できます。デバイストークン、Amazon SNS プラットフォームエンドポイント ARN、タイムスタンプを、アプリケーションサーバーまたは別の永続ストアに保存することをお勧めします。FCM アプリケーションをセットアップし、デバイストークンを取得して保存するには、Google の *Firebase* ドキュメントの[登録トークンの取得と保存](https://firebase.google.com/docs/cloud-messaging/manage-tokens#retrieve-and-store-registration-tokens)を参照してください。

最新のトークンを維持することが重要です。ユーザーのデバイストークンは、次の場合に変更される可能性があります。

1. モバイルアプリケーションが、新しいデバイスで復元されます。

1. ユーザーにより、アプリケーションがアンインストールまたは更新されます。

1. ユーザーが、アプリケーションデータを消去します。

デバイストークンが変更された場合、対応する Amazon SNS エンドポイントを新しいトークンで更新することをお勧めします。これにより、Amazon SNS は登録デバイスとの通信を継続できます。これを行うには、モバイルアプリケーションに次の擬似コードを実装します。有効なプラットフォームエンドポイントを作成および維持するための推奨プラクティスについて説明します。このアプローチは、モバイルアプリケーションが開始されるたびに実行することも、バックグラウンドでスケジュールされたジョブとして実行することもできます。

### 擬似コード
<a name="sns-device-token-pseudo-code"></a>

次の FCM 擬似コードを使用して、デバイストークンを管理および維持します。

```
retrieve the latest token from the mobile OS
if (endpoint arn not stored)
    # first time registration
    call CreatePlatformEndpoint
    store returned endpoint arn
endif

call GetEndpointAttributes on the endpoint arn 

if (getting attributes encountered NotFound exception)
    #endpoint was deleted 
    call CreatePlatformEndpoint
    store returned endpoint arn
else 
    if (token in endpoint does not match latest) or 
        (GetEndpointAttributes shows endpoint as disabled)
        call SetEndpointAttributes to set the 
                     latest token and enable the endpoint
    endif
endif
```

トークンの更新要件の詳細については、Google の *Firebase* ドキュメントの「[定期的なトークンの更新](https://firebase.google.com/docs/cloud-messaging/manage-tokens#update-tokens-on-a-regular-basis)」を参照してください。

## 無効なトークンの検出
<a name="sns-detecting-invalid-tokens"></a>

無効なデバイストークンを使用してメッセージが FCM v1 エンドポイントに配信されると、Amazon SNS は次の例外のいずれかを受け取ります。
+ `UNREGISTERED` (HTTP 404) – Amazon SNS がこの例外を受信すると、`InvalidPlatformToken` の `FailureType` を含む配信失敗イベント、および「*エンドポイントに関連付けられたプラットフォームトークンが有効ではありません*」という `FailureMessage` を受け取ります。Amazon SNS は、この例外で配信が失敗すると、プラットフォームエンドポイントを無効にします。
+ `INVALID_ARGUMENT` (HTTP 400) – Amazon SNS がこの例外を受信すると、デバイストークンまたはメッセージペイロードが無効であることを意味します。詳細については、Google の *Firebase* ドキュメントの「[ErrorCode](https://firebase.google.com/docs/reference/fcm/rest/v1/ErrorCode)」を参照してください。

`INVALID_ARGUMENT` はこれらのいずれの場合でも返される可能性があるため、Amazon SNS は `InvalidNotification` の `FailureType`、および「*通知本文が無効です*」という `FailureMessage` を返します。このエラーが表示されたら、ペイロードが正しいことを確認します。ペイロードが正しい場合は、デバイストークンが最新であることを確認します。この例外で配信が失敗しても、Amazon SNS はプラットフォームエンドポイントを無効にしません。

`InvalidPlatformToken` 配信失敗イベントが発生するもう 1 つのケースは、登録されたデバイストークンが、そのメッセージを送信しようとするアプリケーションにない場合です。この場合、Google は *SENDER\$1ID\$1MISMATCH* エラーを返します。Amazon SNS は、この例外で配信が失敗すると、プラットフォームエンドポイントを無効にします。

FCM v1 API から受信したすべての観測されたエラーコードは、アプリケーションの[配信ステータスログ](topics-attrib.md)を設定するときに、CloudWatch で利用できます。

アプリケーションの配信イベントを受け取るには、「[使用可能なアプリケーションイベント](application-event-notifications.md#application-event-notifications-events)」を参照してください。

## 古いトークンの削除
<a name="sns-removing-stale-tokens"></a>

エンドポイントデバイスへのメッセージ配信が失敗すると、トークンは古いとみなされます。Amazon SNS は、これらの古いトークンをプラットフォームアプリケーションの無効なエンドポイントとして設定します。無効になったエンドポイントに発行すると、Amazon SNS は `EventDeliveryFailure` イベントと `EndpointDisabled` の `FailureType`、および「* エンドポイントが無効です*」という `FailureMessage` を返します。アプリケーションの配信イベントを受け取るには、「[使用可能なアプリケーションイベント](application-event-notifications.md#application-event-notifications-events)」を参照してください。

Amazon SNS からこのエラーを受け取った場合、プラットフォームアプリケーションで古いトークンを削除または更新する必要があります。