Я разрабатываю приложение для Android, которое получает push-уведомление с использованием AWS SNS. Основной поток: я получаю идентификатор подписки, подписываю секретный ключ и тему для подписки на api.I создаю конечную точку, используя предоставленное приложение ARN платформы и подписываюсь на эту тему.Не получать push-уведомление с использованием 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 это я не получаю никакого толчок уведомления, связанные с этой темой. Я пропустил что-то в коде ??? Любая помощь будет оценена!
Вы добавили ключ api в качестве учетных данных при создании приложения платформы ARN ??? –