AWS SNSを使用してプッシュ通知を受け取るAndroidアプリを開発中です。基本的な流れは、subscribe id、subscribe secret key、apiから購読するトピックを受け取ることです。私は、提供されたプラットフォームアプリケーション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();
}
私は、ログに私のサブスクリプションIDを見ることができるconsole.The問題は、私はそのトピックに関連するすべてのプッシュ通知を受信していないです。 私はコードで何かを逃しましたか?どんな助けもありがとう!
プラットフォームアプリケーションARNを作成しているときに、資格情報としてAPIキーを追加しましたか? –