플랫폼 엔드포인트 생성 - Amazon Simple Notification Service

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

플랫폼 엔드포인트 생성

앱과 모바일 디바이스가 푸시 알림 서비스에 등록되면 푸시 알림 서비스는 디바이스 토큰을 반환합니다. Amazon SNS는 디바이스 토큰을 사용하여 직접 푸시 알림 메시지를 보낼 수 있는 모바일 엔드포인트를 생성합니다. 자세한 정보는 Amazon SNS 사용자 알림에 대한 사전 조건사용자 알림 프로세스 개요에서 확인하세요.

이 섹션에서는 플랫폼 엔드포인트를 생성할 때 권장되는 방법에 대해 설명합니다.

플랫폼 엔드포인트 생성

Amazon SNS로 앱에 알림을 푸시하려면 먼저 플랫폼 엔드포인트 생성 작업을 호출해 Amazon SNS에 해당 앱의 디바이스 토큰을 등록해야 합니다. 이 작업은 플랫폼 애플리케이션의 Amazon 리소스 이름(ARN)과 디바이스 토큰을 파라미터로 취하고 생성된 플랫폼 엔드포인트의 ARN을 반환합니다.

CreatePlatformEndpoint작업은 다음과 같은 작업을 수행합니다.

  • 플랫폼 엔드포인트가 이미 있는 경우 다시 생성하지 마십시오. 기존 플랫폼 엔드포인트의 ARN 호출자로 돌아가십시오.

  • 디바이스 토큰은 같지만 설정이 다른 플랫폼 엔드포인트가 이미 있는 경우 다시 생성하지 마십시오. 호출자에 예외를 발생시키십시오.

  • 플랫폼 엔드포인트가 없으면 생성하세요. 새로 생성한 플랫폼 엔드포인트의 ARN 호출자로 돌아가십시오.

앱이 시작할 때마다 바로 플랫폼 엔드포인트 생성 작업을 호출해서는 안 됩니다. 이 방법이 항상 작동하는 엔드포인트를 제공하는 것은 아니기 때문입니다. 이러한 상황은 예를 들면 같은 디바이스에서 앱을 제거했다가 다시 설치하고, 이에 대한 엔드포인트가 이미 있지만 비활성화된 경우에 발생할 수 있습니다. 성공적으로 등록하면 다음과 같은 결과를 얻을 수 있어야 합니다.

  1. 이 앱-디바이스 조합에 대해 플랫폼 엔드포인트가 있는지 확인합니다.

  2. 플랫폼 엔드포인트의 디바이스 토큰이 유효한 최신 디바이스 토큰인지 확인합니다.

  3. 플랫폼 엔드포인트가 활성화되어 있고 사용할 준비가 되어 있는지 확인합니다.

의사(Pseudo) 코드

다음 의사(pseudo) 코드는 다양한 시작 조건에서 작동하고 활성화된 현재 플랫폼 엔드포인트를 생성하는 데 권장되는 사례를 설명합니다. 이 방법은 앱을 처음 등록하는지 아닌지, 이 앱의 플랫폼 엔드포인트가 이미 있는지, 플랫폼 엔드포인트가 활성화되어 있는지, 올바른 디바이스 토큰이 있는지 여부에 상관없이 효과가 있습니다. 연이어 여러 번 호출해도 중복 플랫폼 엔드포인트가 생성되거나, 이미 최신 상태이고 활성화된 경우에 기존 플랫폼 엔드포인트가 변경되지 않으므로 무관합니다.

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에 디바이스 토큰 변경을 알리는 데에도 사용됩니다. 이 경우 최신 디바이스 토큰 값으로 작업을 호출하면 됩니다. 이 방법에 대해 유의해야 할 몇 가지 사항은 다음과 같습니다.

  • 플랫폼 엔드포인트 생성 작업을 호출할 수도 있는 두 가지 경우가 있습니다. 최초 등록 중에서와 같이 앱에서 자신의 고유한 플랫폼 엔드포인트 ARN을 인식하지 못하는 맨 처음에 호출할 수 있습니다. 애플리케이션에서 해당 엔드포인트 ARN을 인식하지만 삭제된 경우와 같이 초기 엔드포인트 속성 가져오기 작업 호출이 찾을 수 없음 예외와 함께 실패할 경우에도 호출될 수 있습니다.

  • 방금 플랫폼 엔드포인트를 생성했더라도 플랫폼 엔드포인트의 상태를 확인하기 위해 엔드포인트 속성 가져오기 작업이 호출됩니다. 이러한 상황은 플랫폼 엔드포인트가 이미 있지만 비활성화되어 있는 경우에 발생합니다. 이 경우 플랫폼 엔드포인트 생성 작업이 성공하지만 플랫폼 엔드포인트가 활성화되지 않기 때문에 성공을 반환하기 전에 플랫폼 엔드포인트의 상태를 다시 한 번 확인해야 합니다.

AWS SDK 예제

다음 코드는 SDK에서 제공하는 Amazon SNS 클라이언트를 사용하여 이전 유사 코드를 구현하는 방법을 보여줍니다. AWS

AWS SDK를 사용하려면 자격 증명으로 구성해야 합니다. 자세한 정보는 AWS SDK 및 도구 참조 가이드의 공유 구성 및 자격 증명 파일을 참조하세요.

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 name of the FIFO topic.\s 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); System.exit(1); } 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()); System.exit(1); } } }

자세한 정보는 모바일 푸시 API 작업을 참조하세요.

문제 해결

오래된 디바이스 토큰으로 플랫폼 엔드포인트 생성 반복 호출

특히 FCM 엔드포인트의 경우 애플리케이션이 처음 발급된 기기 토큰을 저장한 다음 애플리케이션을 시작할 때마다 해당 기기 토큰으로 플랫폼 엔드포인트 생성을 호출하는 것이 최선이라고 생각할 수 있습니다. 이렇게 하면 앱에서 디바이스 토큰의 상태를 관리하지 않아도 되고 Amazon SNS에서 디바이스 토큰을 최신 값으로 자동 업데이트하기 때문에 올바르게 보일 수도 있습니다. 하지만 이 해결 방법에는 여러 가지 심각한 문제가 있습니다.

  • Amazon SNS는 만료된 디바이스 토큰을 새 디바이스 토큰으로 업데이트하기 위해 FCM의 피드백에 의존합니다. FCM은 일정 기간 동안 이전 디바이스 토큰에 대한 정보를 유지하지만 무기한은 아닙니다. FCM에서 이전 디바이스 토큰과 새 디바이스 토큰 사이의 연결에 대해 잊어버리면 Amazon SNS가 플랫폼 엔드포인트에 저장된 디바이스 토큰을 올바른 값으로 더 이상 업데이트하지 않고, 대신 플랫폼 엔드포인트를 비활성화합니다.

  • 플랫폼 애플리케이션에는 동일한 디바이스 토큰에 해당하는 여러 플랫폼 엔드포인트가 포함되어 있습니다.

  • Amazon SNS는 동일한 디바이스 토큰으로 시작해서 플랫폼 엔드포인트를 몇 개나 생성할 수 있는지에 대한 할당량을 둡니다. 결국 유효하지 않은 파라미터 예외 및 "이 엔드포인트가 이미 다른 토큰으로 등록되었습니다." 오류 메시지와 함께 새 엔드포인트 생성이 실패합니다.

FCM 엔드포인트 관리에 대한 자세한 내용은 을 참조하십시오. Firebase 클라우드 메시징 (FCM) 엔드포인트 관리

유효하지 않은 디바이스 토큰과 연결된 플랫폼 엔드포인트 다시 활성화

모바일 플랫폼(예: APN 또는 FCM)에서 Amazon SNS에 게시 요청에 사용된 디바이스 토큰이 유효하지 않다고 알리면 Amazon SNS에서 해당 디바이스 토큰과 연결된 플랫폼 엔드포인트를 비활성화합니다. 그리고 나서 Amazon SNS는 해당 디바이스 토큰에 대한 후속 게시를 거부합니다. 플랫폼 엔드포인트를 다시 활성화하고 계속 게시하는 것이 최선이라고 생각할지도 모르겠지만, 대부분의 경우에서 이렇게 하면 아무 효과가 없습니다. 즉, 게시되는 메시지가 전송되지 않고 플랫폼 엔드포인트가 이후에 곧 다시 비활성화됩니다.

플랫폼 엔드포인트와 연결된 디바이스 토큰이 실제로 유효하지 않기 때문입니다. 더 이상 설치된 앱에 해당하지 않기 때문에 여기에 전송해도 실패하는 것입니다. 다음에 게시되면 모바일 플랫폼에서 다시 한 번 Amazon SNS에 디바이스 토큰이 유효하지 않다고 알려 주고, Amazon SNS가 또 다시 플랫폼 엔드포인트를 비활성화합니다.

비활성화된 플랫폼 엔드포인트를 다시 활성화하려면 설정된 엔드포인트 속성 작업 호출과 함께 유효한 디바이스 토큰과 연결한 후에 활성화해야 합니다. 그래야만 해당 플랫폼 엔드포인트에 전송해도 성공할 수 있습니다. 해당 장치 토큰을 업데이트하지 않고 플랫폼 엔드포인트를 다시 활성화해도 효과가 있는 유일한 경우는 해당 엔드포인트와 연결된 장치 토큰이 이전에는 유효하지 않았다가 다시 유효해진 경우입니다. 이러한 상황은 예를 들면 같은 모바일 디바이스에서 앱을 제거했다가 다시 설치하고, 같은 디바이스 토큰을 받을 경우에 발생할 수 있습니다. 위에 소개한 방법은 이와 같이 연결된 디바이스 토큰이 제공되는 가장 최신 디바이스 토큰임을 확인한 후에만 플랫폼 엔드포인트를 다시 활성화하도록 합니다.