

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

# Amazon SNS での Google Firebase Cloud Messaging v1 ペイロードの使用
<a name="sns-fcm-v1-payloads"></a>

Amazon SNS で、FCM HTTP v1 API を使用して、Android、iOS、および Webpush の送信先に通知を送信できます。このトピックでは、CLI または Amazon SNS API を使用してモバイルプッシュ通知を発行する際のペイロード構造の例を示します。

FCM 通知を送信するときに、ペイロードに次のメッセージタイプを含めることができます。
+ **データメッセージ** – データメッセージはクライアントアプリによって処理され、カスタムのキーと値のペアが含まれます。データメッセージを作成するときは、JSON オブジェクトの `data` キーを値として含め、カスタムのキーと値のペアを入力する必要があります。
+ **通知メッセージ**または**表示メッセージ** – 通知メッセージには、FCM SDK によって処理される事前定義されたキーのセットが含まれます。これらのキーは、配信先のデバイスタイプによって異なります。プラットフォーム固有の通知キーの詳細については、以下を参照してください。
  + [Android 通知キー](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)
  + [APNS 通知キー](https://developer.apple.com/documentation/usernotifications/generating-a-remote-notification)
  + [Webpush 通知キー](https://developer.mozilla.org/en-US/docs/Web/API/Notification)

FCM メッセージタイプの詳細については、Google の「*Firebase*」ドキュメントの「[メッセージタイプ](https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages)」を参照してください。

## FCM v1 ペイロード構造を使用したメッセージの送信
<a name="sending-messages-using-v1-payload"></a>

初めて FCM アプリケーションを作成する場合、または FCM v1 機能を活用する場合は、FCM v1 形式のペイロードの送信をオプトインできます。これを行うには、最上位キー `fcmV1Message` を含める必要があります。FCM v1 ペイロードの構築の詳細については、Google の「*Firebase*」ドキュメントの「[レガシー FCM API から HTTP v1 への移行](https://firebase.google.com/docs/cloud-messaging/migrate-v1)」および[「プラットフォーム間でのメッセージのカスタマイズ](https://firebase.google.com/docs/cloud-messaging/concept-options#customizing-a-message-across-platforms)」を参照してください。

**Amazon SNS に送信された FCM v1 ペイロードの例:**

**注記**  
次の例で使用されている `GCM` キー値は、Amazon SNS を使用して通知を発行するときに文字列としてエンコードする必要があります。

```
{
  "GCM": "{ 
    \"fcmV1Message\": { 
      \"validate_only\": false,
      \"message\": {
        \"notification\": {
          \"title\": \"string\",
          \"body\": \"string\"
        },
        \"data\": {
          \"dataGen\": \"priority message\"
        },
        \"android\": {
          \"priority\": \"high\",
          \"notification\": {
            \"body_loc_args\": [\"string\"],
            \"title_loc_args\": [\"string\"],
            \"sound\": \"string\",
            \"title_loc_key\": \"string\",
            \"title\": \"string\",
            \"body\": \"string\",
            \"click_action\": \"clicky_clacky\",
            \"body_loc_key\": \"string\"
          },
          \"data\": {
            \"dataAndroid\": \"priority message\"
          },
          \"ttl\": \"10023.32s\"
        },
        \"apns\": {
          \"payload\": {
            \"aps\": {
              \"alert\": {
                \"subtitle\": \"string\",
                \"title-loc-args\": [\"string\"],
                \"title-loc-key\": \"string\",
                \"loc-args\": [\"string\"],
                \"loc-key\": \"string\",
                \"title\": \"string\",
                \"body\": \"string\"
              },
              \"category\": \"Click\",
              \"content-available\": 0,
              \"sound\": \"string\",
              \"badge\": 5
            }
          }
        },
        \"webpush\": {
          \"notification\": {
            \"badge\": \"5\",
            \"title\": \"string\",
            \"body\": \"string\"
          },
          \"data\": {
            \"dataWeb\": \"priority message\"
          }
        }
      }
    }
  }"
}
```

JSON ペイロードを送信するときは、必ずリクエストに `message-structure` 属性を含めて `json` に設定します。

**CLI の例:**

```
aws sns publish --topic $TOPIC_ARN --message '{"GCM": "{\"fcmV1Message\": {\"message\":{\"notification\":{\"title\":\"string\",\"body\":\"string\"},\"android\":{\"priority\":\"high\",\"notification\":{\"title\":\"string\",\"body\":\"string\"},\"data\":{\"customAndroidDataKey\":\"custom key value\"},\"ttl\":\"0s\"},\"apns\":{\"payload\":{\"aps\":{\"alert\":{\"title\":\"string\", \"body\":\"string\"},\"content-available\":1,\"badge\":5}}},\"webpush\":{\"notification\":{\"badge\":\"URL\",\"body\":\"Test\"},\"data\":{\"customWebpushDataKey\":\"priority message\"}},\"data\":{\"customGeneralDataKey\":\"priority message\"}}}}", "default": "{\"notification\": {\"title\": \"test\"}"}' --region $REGION --message-structure json
```

FCM v1 形式のペイロードの送信の詳細については、Google の「*Firebase*」ドキュメントの以下を参照してください。
+ [レガシー FCM API から HTTP v1 への移行](https://firebase.google.com/docs/cloud-messaging/migrate-v1)
+ [FCM メッセージについて](https://firebase.google.com/docs/cloud-messaging/concept-options#customizing_a_message_across_platforms)
+ [REST リソース: projects.messages](https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages)

## レガシーペイロード構造を使用した FCM v1 API へのメッセージ送信
<a name="sns-fcm-v1-legacy-payload-structure"></a>

FCM v1 に移行する場合、レガシー認証情報に使用していたペイロード構造を変更する必要はありません。Amazon SNS はペイロードを新しい FCM v1 ペイロード構造に変換し、Google に送信します。

入力メッセージのペイロード形式:

```
{
  "GCM": "{\"notification\": {\"title\": \"string\", \"body\": \"string\", \"android_channel_id\": \"string\", \"body_loc_args\": [\"string\"], \"body_loc_key\": \"string\", \"click_action\": \"string\", \"color\": \"string\", \"icon\": \"string\", \"sound\": \"string\", \"tag\": \"string\", \"title_loc_args\": [\"string\"], \"title_loc_key\": \"string\"}, \"data\": {\"message\": \"priority message\"}}"
}
```

Google に送信されたメッセージ:

```
{
  "message": {
    "token": "***",
    "notification": {
      "title": "string",
      "body": "string"
    },
    "android": {
      "priority": "high",
      "notification": {
        "body_loc_args": [
          "string"
        ],
        "title_loc_args": [
          "string"
        ],
        "color": "string",
        "sound": "string",
        "icon": "string",
        "tag": "string",
        "title_loc_key": "string",
        "title": "string",
        "body": "string",
        "click_action": "string",
        "channel_id": "string",
        "body_loc_key": "string"
      },
      "data": {
        "message": "priority message"
      }
    },
    "apns": {
      "payload": {
        "aps": {
          "alert": {
            "title-loc-args": [
              "string"
            ],
            "title-loc-key": "string",
            "loc-args": [
              "string"
            ],
            "loc-key": "string",
            "title": "string",
            "body": "string"
          },
          "category": "string",
          "sound": "string"
        }
      }
    },
    "webpush": {
      "notification": {
        "icon": "string",
        "tag": "string",
        "body": "string",
        "title": "string"
      },
      "data": {
        "message": "priority message"
      }
    },
    "data": {
      "message": "priority message"
    }
  }
}
```

**潜在的なリスク**
+ レガシーから v1 へのマッピングでは、Apple Push Notification Service (APNS) `headers` または `fcm_options`キーをサポートしていません。これらのフィールドを使用する場合は、FCM v1 ペイロードを送信します。
+ 場合によっては、APN デバイスにサイレント通知を送信するには、FCM v1 でメッセージヘッダーが必要です。現在 APN デバイスにサイレント通知を送信している場合、レガシーアプローチでは動作しません。予期しない問題を避けるため、FCM v1 ペイロードを使用することをお勧めします。APN ヘッダーのリストとそれらの使用目的を確認するには、「*Apple デベロッパーガイド*」の「[APN との通信](https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/CommunicatingwithAPNs.html)」を参照してください。
+ 通知の送信時に `TTL` Amazon SNS 属性を使用している場合は、`android` フィールドでのみ更新されます。`TTL` APNS 属性を設定する場合は、FCM v1 ペイロードを使用します。
+ `android`、`apns`、および `webpush` キーはマッピングされ、提供されたすべての関連キーが入力されます。例えば、`title` は 3 つのプラットフォームすべてで共有されているキーであり、これを指定すると、FCM v1 マッピングによって、3 つのプラットフォームすべてに指定したタイトルが入力されます。
+ プラットフォーム間で共有される一部のキーでは、値のタイプが異なります。例えば、`apns` に渡される `badge` キーは整数値、`webpush` に渡される `badge` キーは文字列値である必要があります。`badge` キーが指定された場合、FCM v1 マッピングは、有効な値が指定されたキーのみを入力します。

## FCM 配信失敗イベント
<a name="sns-fcm-delivery-failure-events"></a>

次の表に、Amazon SNS 障害タイプを示します。これは、FCM v1 通知リクエストで Google から受信したエラー/ステータスコードに対応しています。FCM v1 API から受信したすべての観測されたエラーコードは、アプリケーションの[配信ステータスログ](topics-attrib.md)を設定するときに、CloudWatch で利用できます。


| FCM エラー/ステータスコード | Amazon SNS 障害タイプ | 障害メッセージ | 原因と緩和策 | 
| --- | --- | --- | --- | 
|  `UNREGISTERED`  |  `InvalidPlatformToken`  |  エンドポイントに関連付けられたプラットフォームトークンが無効です。  |  エンドポイントにアタッチされたデバイストークンが古くなったか、無効です。Amazon SNS はエンドポイントを無効にしました。Amazon SNS エンドポイントを最新のデバイストークンに更新してください。  | 
|  `INVALID_ARGUMENT`  |  `InvalidNotification`  |  通知本文が無効です。  |  デバイストークンまたはメッセージペイロードが無効である可能性があります。メッセージペイロードが有効であることを確認してください。メッセージペイロードが有効な場合は、Amazon SNS エンドポイントを最新のデバイストークンに更新してください。  | 
|  `SENDER_ID_MISMATCH`  |  `InvalidPlatformToken`  |  エンドポイントに関連付けられたプラットフォームトークンが無効です。  |  デバイストークンに関連付けられたプラットフォームアプリケーションには、デバイストークンに送信するアクセス許可がありません。Amazon SNS プラットフォームアプリケーションで正しい FCM 認証情報を使用していることを確認してください。  | 
|  `UNAVAILABLE`  |  `DependencyUnavailable`  |  依存関係は使用できません。  |  FCM はリクエストを時間内に処理できませんでした。Amazon SNS で実行されたすべての再試行が失敗しました。これらのメッセージをデッドレターキュー (DLQ) に保存して、後で再処理できます。  | 
|  `INTERNAL`  |  `UnexpectedFailure`  |  予期しない失敗です。Amazon にお問い合わせください。失敗フレーズ [内部エラー〕。  |  リクエストの処理中に FCM サーバーでエラーが発生しました。Amazon SNS で実行されたすべての再試行が失敗しました。これらのメッセージをデッドレターキュー (DLQ) に保存して、後で再処理できます。  | 
|  `THIRD_PARTY_AUTH_ERROR`  |  `InvalidCredentials`  |  プラットフォームアプリケーションの認証情報が無効です。  |  iOS デバイスまたは Webpush デバイスをターゲットにしたメッセージを送信できませんでした。開発用と本番用の認証情報が有効であることを確認してください。  | 
|  `QUOTA_EXCEEDED`  |  `Throttled`  |  リクエストは [gcm] によってスロットリングされました。  |  メッセージレート、デバイスメッセージレート、またはトピックメッセージレートがクォータを超過しています。この問題を解決する方法については、Google の「*Firebase*」ドキュメントの「[ErrorCode](https://firebase.google.com/docs/reference/fcm/rest/v1/ErrorCode)」を参照してください。  | 
|  `PERMISSION_DENIED`  |  `InvalidNotification`  |  通知本文が無効です。  |  `PERMISSION_DENIED` 例外の場合、発信者 (FCM アプリケーション) にペイロードで指定されたオペレーションを実行するアクセス許可がありません。FCM コンソールに移動し、認証情報で必要な API アクションが有効になっていることを確認してください。  | 