AWS SNS를 사용하여 푸시 알림을받는 Android 앱을 개발 중입니다. 기본 흐름은 subscribe id, subscribe secret key, api.i에서 구독 할 주제를 제공 받고 제공된 플랫폼 응용 프로그램 ARN을 사용하여 끝점을 만들고 해당 항목에 가입합니다.AWS SNS를 사용하여 푸시 알림을 수신하지 않음 android
내 코드입니다 : 그 주제와 관련된 푸시 알림이 수신되지 않는 경우입니다
AmazonSNSClient client;
SharedPreferences userPreferences;
ProfileData profileData;
String token;
@Override
protected Void doInBackground(ARScreen.Container... containers) {
ARScreen.Container container = containers[0];
profileData = container.profileData;
userPreferences = container.userPreferences;
token = container.token;
BasicAWSCredentials credentials = new BasicAWSCredentials(profileData.getSubscribeId(), profileData.getSubscribeSecret());
client = new AmazonSNSClient(credentials);
client.setRegion(Region.getRegion(Regions.AP_SOUTHEAST_1));
registerWithSNS(token);
return null;
}
@SuppressLint("CommitPrefEdits")
@SuppressWarnings({"deprecation", "unchecked"})
public void registerWithSNS(String regId) {
String endpointArn = retrieveEndpointArn();
boolean updateNeeded = false;
boolean createNeeded = (null == endpointArn);
if (createNeeded) {
// No platform endpoint ARN is stored; need to call createEndpoint.
endpointArn = createEndpoint(regId);
createNeeded = false;
}
System.out.println("Retrieving platform endpoint data...");
// Look up the platform endpoint and make sure the data in it is current, even if
// it was just created.
try {
GetEndpointAttributesRequest geaReq =
new GetEndpointAttributesRequest()
.withEndpointArn(endpointArn);
GetEndpointAttributesResult geaRes =
client.getEndpointAttributes(geaReq);
updateNeeded = !geaRes.getAttributes().get("Token").equals(regId)
|| !geaRes.getAttributes().get("Enabled").equalsIgnoreCase("true");
} catch (NotFoundException nfe) {
// We had a stored ARN, but the platform endpoint associated with it
// disappeared. Recreate it.
createNeeded = true;
}
if (createNeeded) {
createEndpoint(regId);
}
System.out.println("updateNeeded = " + updateNeeded);
if (updateNeeded) {
// The platform endpoint is out of sync with the current data;
// update the token and enable it.
System.out.println("Updating platform endpoint " + endpointArn);
Map attribs = new HashMap();
attribs.put("Token", regId);
attribs.put("Enabled", "true");
SetEndpointAttributesRequest saeReq =
new SetEndpointAttributesRequest()
.withEndpointArn(endpointArn)
.withAttributes(attribs);
client.setEndpointAttributes(saeReq);
}
String subscriptionId = client.subscribe(new SubscribeRequest()
.withEndpoint(endpointArn)
.withProtocol("application")
.withTopicArn(profileData.getSnstopic())
).getSubscriptionArn();
System.out.println("Id" + subscriptionId);
SubscribeRequest subscribeRequest = new SubscribeRequest(profileData.getSnstopic(), "application", endpointArn);
SubscribeResult result = client.subscribe(subscribeRequest);
if (result != null) {
SharedPreferences.Editor editor = userPreferences.edit();
editor.putBoolean("isSubscribed", true);
editor.commit();
}
}
/**
* @return never null
*/
private String createEndpoint(String token) {
String endpointArn;
try {
System.out.println("Creating platform endpoint with token " + token);
CreatePlatformEndpointRequest cpeReq =
new CreatePlatformEndpointRequest()
.withPlatformApplicationArn("My Platform Application ARN")
.withToken(token);
CreatePlatformEndpointResult cpeRes = client
.createPlatformEndpoint(cpeReq);
endpointArn = cpeRes.getEndpointArn();
} catch (InvalidParameterException ipe) {
String message = ipe.getErrorMessage();
System.out.println("Exception message: " + message);
Pattern p = Pattern
.compile(".*Endpoint (arn:aws:sns[^ ]+) already exists " +
"with the same token.*");
Matcher m = p.matcher(message);
if (m.matches()) {
// The platform endpoint already exists for this token, but with
// additional custom data that
// createEndpoint doesn't want to overwrite. Just use the
// existing platform endpoint.
endpointArn = m.group(1);
} else {
// Rethrow the exception, the input is actually bad.
throw ipe;
}
}
storeEndpointArn(endpointArn);
return endpointArn;
}
/**
* @return the ARN the app was registered under previously, or null if no
* platform endpoint ARN is stored.
*/
private String retrieveEndpointArn() {
// Retrieve the platform endpoint ARN from permanent storage,
// or return null if null is stored.
return userPreferences.getString("endPointArn", null);
}
/**
* Stores the platform endpoint ARN in permanent storage for lookup next time.
*/
@SuppressLint("CommitPrefEdits")
private void storeEndpointArn(String endpointArn) {
// Write the platform endpoint ARN to permanent storage.
SharedPreferences.Editor editor = userPreferences.edit();
editor.putString("endPointArn", endpointArn);
editor.commit();
}
내가 로그 console.The 문제에서 서브 스크립 션 ID를 볼 수 있습니다. 코드에서 뭔가 빠졌습니까? 어떤 도움을 주시면 감사하겠습니다 !!
플랫폼 응용 프로그램 ARN을 만드는 동안 자격 증명으로 API 키를 추가 했습니까 ??? –