設定行動通知的 Amazon SNS平台端點 - Amazon Simple Notification Service

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

設定行動通知的 Amazon SNS平台端點

當應用程式和行動裝置註冊推送通知服務時,推送通知服務會傳回裝置字符。Amazon SNS使用裝置權杖來建立行動端點,以便傳送直接推送通知訊息。如需詳細資訊,請參閱 Amazon SNS使用者通知的先決條件使用 Amazon 設定推送通知 SNS

本節說明建立平台端點的建議方法。

建立平台端點

若要使用 Amazon 將通知推送至應用程式SNS,必須先SNS呼叫建立平台端點動作,將該應用程式的裝置權杖向 Amazon 註冊。此動作會將平台應用程式的 Amazon Resource Name (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

此方法在應用程式任何時候想要註冊或重新註冊時都可使用。在通知 Amazon SNS 裝置權杖變更時,也可以使用它。若是此狀況,您可以只呼叫具有最新字符值的動作。關於此方法有幾點要注意:

  • 有兩種情況它可能呼叫建立平台端點動作。一開始可能會呼叫它,其中應用程式不知道自己的平台端點 ARN,就像第一次註冊期間一樣。如果初始GetEndpointAttributes動作呼叫失敗,但發生找不到的例外狀況,也會稱為 ,如果應用程式知道其端點,ARN但已刪除,也會發生這種情況。

  • 即使剛建立平台端點,也會呼叫 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 適用於 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施加配額。最後,建立新的端點將因為無效的參數例外狀況而失敗,並且出現下列錯誤訊息:「此端點已經註冊不同字符」。

如需管理FCM端點的詳細資訊,請參閱 Firebase Cloud Messaging 端點的 Amazon SNS管理

重新啟用與無效裝置字符關聯的平台端點

當行動平台 (例如 APNs或 FCM) 通知 Amazon 發佈請求中使用的SNS裝置權杖無效時,Amazon 會SNS停用與該裝置權杖相關聯的平台端點。然後,Amazon SNS將拒絕對該裝置權杖的後續發佈。您可能會想最好只要重新啟用平台端點並持續發佈,但在大多數情況中,如此做並沒有作用:發佈的訊息不會傳遞而平台端點會在之後很快再次停用。

這是因為與平台端點關聯的裝置字符真的無效 傳遞到平台端點無法成功,因為其不再對應到任何安裝的應用程式。下一次發佈時,行動平台會再次通知 Amazon SNS 裝置權杖無效,Amazon SNS會再次停用平台端點。

若要重新啟用已停用的平台端點,其需要與有效的裝置字符關聯 (使用一組端點屬性動作呼叫),然後啟用。只有這樣傳遞到該平台端點才會成功。重新啟用平台端點而不更新其裝置字符,唯有在裝置字符與原本無效但再次生效的該端點關聯時才有作用。這可能會發生,例如應用程式在同一個行動裝置上解除安裝然後重新安裝,並且接收相同的裝置字符時。以上所述的方法,確保僅在確認裝置字符與其關聯後重新啟用平台端點,是最新可用的方法。