Amazon SNS에서 "EndpointDisabled"받기
Amazon SNS를 사용하고 있습니다. 알림은 잘 작동하지만 때때로이 오류가 발생합니다.
{
"message": "Endpoint is disabled",
"code": "EndpointDisabled",
"name": "EndpointDisabled",
"statusCode": 400,
"retryable": false
}
그 이유를 아실 수도 있습니다.
같은 새 SNS 주제를 생성 한 push-notification-failures
다음 APNS / APNS_SANDBOX 애플리케이션의 "전송 실패"이벤트를 여기에 연결할 수 있습니다. 이메일을 통해 이벤트를 구독하고 확인하면 실패에 대한 유용한 디버깅 정보를 얻을 수 있습니다. 이 모든 작업은 SNS 콘솔을 통해 수행 할 수 있으며 수행하는 데 API 호출이 필요하지 않습니다.
이 SNS 주제에 HTTP 엔드 포인트를 구독하고 모든 전송 실패를 기록하여 작업 할 기록 데이터를 확보하고 프로덕션 문제를 디버깅하는 것이 좋습니다.
예를 들어, FailureMessage
"엔드 포인트와 연결된 플랫폼 토큰이 유효하지 않습니다."의 전달은 APNS_SANDBOX에서 APNS 등록 장치로 또는 그 반대로 메시지를 보내는 것을 의미합니다. 이는 빌드 시스템에 잘못된 APNS 설정이 있음을 의미 할 수 있습니다. (우리는 APNS_SANDBOX를 사용하는 개발자 빌드 바이너리와 로컬 테스트 및 QA를 위해 APNS를 사용하는 TestFlight 빌드 바이너리의 실망스러운 문제가 있습니다.
지금까지 세 가지 이유를 찾았습니다.
- 때때로 우리는 샌드 박스 앱의 토큰을 혼합했습니다.
- 사용자는 전화 설정에서 알림을 끕니다.
- 사용자가 앱을 제거했습니다.
이것은 Iphons / Ipads에 관한 것입니다.
엔드 포인트를 비활성화 할 수있는 몇 가지 이유가 있습니다. 나는 그것을 어디에도 문서화하지 못했습니다 (놓쳤을 수도 있습니다), 다음은 지원에서 얻은 것입니다.
엔드 포인트로 푸시했지만 토큰이 유효하지 않거나 만료되었습니다. 다음과 같은 경우 토큰이 무효화됩니다.
더 이상 기기에 설치되지 않은 앱에 속합니다.
장치가 백업에서 복원 된 경우. 이로 인해 토큰이 무효화되고 앱이 새 토큰을 요청하고 그에 따라 SNS 엔드 포인트 토큰을 업데이트해야합니다.
앱이 동일한 기기에 다시 설치되었습니다. Android의 경우 앱에 새 토큰이 할당됩니다. 이는 APN에서도 발생하지만 Android에서 더 자주 발생합니다.
APN의 경우 xCode에서 잘못된 프로비저닝 프로파일이 선택됩니다. 이 경우 알림이 실패하고 나중에 APN 피드백 후 장치가 비활성화됩니다.
실수로 IOS 개발 용 토큰을 IOS 프로덕션 앱으로 사용하거나 그 반대로 사용하는 경우.
어떤 이유로 든 Apple이 IOS 푸시 인증서를 무효화하거나 누군가 iTunes Connect 포털에서 푸시 인증서를 취소하는 경우. 기기가 비활성화되기까지 몇 시간이 걸립니다.
SNS에서 플랫폼 애플리케이션 자격 증명을 업데이트하지 않고 Google 개발자 콘솔에서 API 키를 업데이트하는 경우 GCM과 동일합니다.
APN 장치 엔드 포인트로 푸시했지만 만료 된 푸시 인증서로 인해 애플리케이션이 비활성화되었습니다.
GCM 디바이스 엔드 포인트로 푸시하지만 Google 개발자 콘솔에서 API 키가 업데이트되었지만 그에 따라 SNS 플랫폼 애플리케이션 자격 증명이 업데이트되지 않았습니다.
자세한 내용은 내 문제를 해결하는 이 훌륭한 기사 를 추천합니다.
http://docs.aws.amazon.com/sns/latest/APIReference/API_Publish.html 에 따르면 엔드 포인트가 비활성화되었음을 의미합니다.
Enabled-엔드 포인트로의 전달을 활성화 / 비활성화하는 플래그. 메시지 프로세서는 알림 서비스가 엔드 포인트가 유효하지 않음을 SNS에 알리면이를 false로 설정합니다. 사용자는 일반적으로 토큰을 업데이트 한 후 다시 true로 설정할 수 있습니다.
이 경우 "알림 서비스"는 Google의 GCM, Apples APNS 또는 Amazon의 ADM을 의미합니다.
나는 같은 문제가 있었다. 이것이 내가 한 일입니다.
- 키 체인 접근에서 .p12 파일로 FULL CERTIFICATE 내보내기
Keychange Access에서 * private.p12 파일로 PRIVATE KEY 내보내기
다운로드 한 .cer 파일 (iOS Developer MemberCenter에서)과 함께 openssl을 사용하여 공개 .pem 인증서 생성
생성 된 * private.p12 파일과 함께 openssl을 사용하여 개인 .pem 키 파일 생성
- AWS SNS에서 새 애플리케이션을 생성합니다. 이름을 지어주세요. Apple 개발을 선택하십시오.
확장자가 .p12 인 키 체인 접근에서 FULL CERTIFICATE를 선택하고 키 체인 접근에서 내보낼 때 선택한 암호를 입력합니다. 공개 CERTIFICATE .pem 파일의 내용을 시작 및 끝 줄을 포함하여 "인증서"라는 레이블이 붙은 텍스트 영역에 복사합니다. :
-----BEGIN CERTIFICATE----- -----END CERTIFICATE-----
다음 줄로 시작하고 끝나는 개인 키 .pem 파일의 일부만 "Private Key"레이블이 지정된 텍스트 영역에 복사합니다.
-----BEGIN RSA PRIVATE KEY----- -----END RSA PRIVATE KEY-----
Phonegap-plugin-push 1.4.4와 함께 Cordova를 사용하지만 내 문제는 phonecap과 관련이 없습니다. 위의 내용에 대한 약간의 혼란을 제외하고, 마침내 나를 위해 트릭을 한 것은 XCode에서 내 프로젝트를 열고 내 프로젝트의 대상을 찾은 다음 푸시 알림을 활성화하는 것이 었습니다. 이렇게하면 앱 ID에 "푸시 알림"권한이 자동으로 추가됩니다. 다음에 앱이 장치에 설치되면 푸시 알림이 작동합니다. 적어도 그것은 나를 위해했다.
나는 이것이 나와 같은 문제를 겪고있는 누군가를 반나절의 일로 구할 수 있기를 바랍니다! :)
과감한 조치를 취하기 전에 빠른 체크리스트 :
- 키 체인 앱을 사용하여 CSR (인증서 서명 요청)을 생성합니다 .
- Keychain App을 사용하여 APNS 인증서와 개인 키를 단일 p12 파일로 내 보냅니다 .
- Amazon SNS에서 새 애플리케이션을 생성 할 때 플랫폼은 APNS 환경 ( 양측에서 개발 / 생산) 과 일치해야합니다 .
- 기기 토큰을 요청할 때 올바른 애플리케이션 에 있어야합니다 (애플리케이션의 번들 식별자가 APNS 인증서와 일치 함).
- AWS SNS에서 새 플랫폼 엔드 포인트를 생성 할 때 올바른 애플리케이션 (양호한 애플리케이션 인증서 및 양호한 개발 / 생산 플랫폼)에 디바이스 토큰을 추가해야합니다 .
제 경우에는 타사 SSL 도구를 사용하여 CSR을 생성했습니다. Apple 개발자 포털에서 유효한 인증서를 얻었지만 개인 키는 없습니다. 그런 다음 Windows의 인증서 도구를 사용하여 큰 성공을 거두지 못했습니다. 시간 낭비. Mac을 시작하십시오.
그런 다음 AmazonMobilePush 샘플 앱을 사용하여 장치 토큰을 얻었습니다. 데모의 번들 식별자가 내 인증서와 일치하지 않기 때문에 엔드 포인트가 유효하지 않습니다. 각 SNS에서 엔드 포인트를 보내는 것이 비활성화되었습니다 (false). 결국 원인은 분명했지만 여전히 소중한 시간을 낭비하고 있습니다.
오류가 발생 End Point is Disabled
하면 아래 코드를 사용하여 endPoint를 활성화 한 다음 Amazon 자격 증명을 사용하여 푸시 알림을 활성화합니다.
*//Enable Device*
var sns = new AmazonSimpleNotificationServiceClient("AwsAccesskeyId", "AwsSecrteAccessKey", RegionEndpoint.USWest1);
Dictionary<string, string> objDictCheckEndpointEnable = new Dictionary<string, string>();
objDictCheckEndpointEnable.Add("Enabled", "False");
sns.SetEndpointAttributes(new SetEndpointAttributesRequest
{
Attributes = objDictCheckEndpointEnable,
EndpointArn = "AwsEndPointArn" //This is Device End Point Arn
});
*//End*
저에게는 SNS 플랫폼 애플리케이션 엔드 포인트가 올바르게 설정되지 않았기 때문에 "엔드 포인트와 연결된 플랫폼 토큰이 유효하지 않습니다"라는 메시지가 표시되었습니다. 특히 SNS 콘솔은 올바른 인증서와 개인 키가 포함되어 있어도 내 .p12 파일에서 자격 증명을 올바르게 읽지 못했습니다. 이 게시물을 기반으로 한 솔루션 은 인증서를 포함하고 키는없는 두 번째 .p12 파일을 만드는 것이 었습니다. 첫 번째 .p12 파일에서 자격 증명을로드 한 다음 두 번째 .p12 파일에서 자격 증명을로드했습니다. 그렇게했을 때 인증서 문자열이 변경되는 것을 볼 수 있었고 나중에 문제가 없었습니다.
If you are creating a production endpoint, SNS will warn you about mismatched certs, but it does no such checking for development endpoints. The only way you will know that the endpoint is borked is when you get the platform token error.
I sure hope this helps somebody out there, as it drove me to distraction.
I am using this. If the get endpoint response finds the NotFound error, it creates an endpoint (this should never happen, but hell, it's on AWS SNS documentation website). If that doesn't happen, it means you're getting the info for the endpoint. It can either be ok (tokens match and enabled is true), or the other way around (in which case you need to update it).
- (void)getEndpointDetailsWithResponse:(void(^)(AWSSNSGetEndpointAttributesResponse *response, AWSTask *))handleResponse {
NSString * deviceTokenForAWS = [self deviceTokenForAWS];
AWSSNS *manager = [AWSSNS SNSForKey:@"EUWest1SNS"];
AWSSNSGetEndpointAttributesInput *input = [AWSSNSGetEndpointAttributesInput new];
input.endpointArn = self.endpointArn;
AWSTask *getEndpointAttributesTask = [manager getEndpointAttributes:input];
[getEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
NSLog(@"%@ Error: %@", task.result, task.error);
AWSSNSGetEndpointAttributesResponse *result = task.result;
NSError *error = task.error;
if (error.code == AWSSNSErrorNotFound) {
[self createEndpointWithResponse:^(AWSSNSCreateEndpointResponse *createResponse) {
dispatch_async(dispatch_get_main_queue(), ^{
if (handleResponse != nil) {
handleResponse(result, task);
}
});
}];
} else {
NSLog(@"response for get endpoint attributes : %@", result);
NSString *token = [result.attributes valueForKey:@"Token"];
NSString *enabled = [result.attributes valueForKey:@"Enabled"];
NSLog(@"token : %@, enabled : %@", token, enabled);
BOOL wasSuccessful = [token isEqualToString:deviceTokenForAWS] && ([enabled localizedCaseInsensitiveCompare:@"true"] == NSOrderedSame);
if (!wasSuccessful) {
NSLog(@"device token does not match the AWS token OR it is disabled!");
NSLog(@"Need to update the endpoint");
AWSSNSSetEndpointAttributesInput *seai = [AWSSNSSetEndpointAttributesInput new];
seai.endpointArn = self.endpointArn;
NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:deviceTokenForAWS, @"Token", @"true", @"Enabled", nil];
seai.attributes = attributes;
AWSTask *setEndpointAttributesTask = [manager setEndpointAttributes:seai];
[setEndpointAttributesTask continueWithBlock:^id(AWSTask *task) {
NSLog(@"response : %@, error: %@", task.result, task.error);
dispatch_async(dispatch_get_main_queue(), ^{
if (handleResponse != nil) {
handleResponse(result, task);
}
});
return nil;
}];
} else {
NSLog(@"all is good with the endpoint");
dispatch_async(dispatch_get_main_queue(), ^{
if (handleResponse != nil) {
handleResponse(result, task);
}
});
}
}
return nil;
}];
}
This is the exact replica of the AWS SNS token management documentation found here: https://mobile.awsblog.com/post/Tx223MJB0XKV9RU/Mobile-token-management-with-Amazon-SNS
I can attach the rest of my implementation if needed, but this part is the most important one.
ReferenceURL : https://stackoverflow.com/questions/19374411/getting-endpointdisabled-from-amazon-sns
'Programing' 카테고리의 다른 글
IIS 7.5 + RESTFul 서비스에 대해 PUT 및 DELETE 사용, 확장 없음 (0) | 2021.01.05 |
---|---|
Git에서 작동하는 트리 라인 엔딩을 정규화하는 방법은 무엇입니까? (0) | 2021.01.05 |
Swift에서 배열 "Join"기능의 목적 (0) | 2021.01.05 |
유니 코드 what ()의 예외 (0) | 2020.12.31 |
python-matplotlib에서 3D 다각형 플로팅 (0) | 2020.12.31 |