2016-09-08 33 views
0

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問題は、私はそのトピックに関連するすべてのプッシュ通知を受信して​​いないです。 私はコードで何かを逃しましたか?どんな助けもありがとう!

+0

プラットフォームアプリケーションARNを作成しているときに、資格情報としてAPIキーを追加しましたか? –

答えて

0

すべての設定が適切に設定されている場合(MobileHubを使用して、AWSのサービス(プッシュとCognitoのSNSなど)をリンクすることをお勧めします。 アプリに実装したPushListenerServiceに注意するだけです。

まず、あなたがあなたのAndroidManifest.xmlを上の次の行を追加していることを確認します。

<!-- BEGIN - PUSH NOTIFICATIONS WITH GOOGLE CLOUD MESSAGING (GCM) --> 

    <receiver 
     android:name="com.google.android.gms.gcm.GcmReceiver" 
     android:exported="true" 
     android:permission="com.google.android.c2dm.permission.SEND"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
      <category android:name="com.yourpackagename" /> 
     </intent-filter> 
    </receiver> 

    <service 
     android:name=".push.service.PushListenerService" 
     android:exported="false"> 
     <intent-filter> 
      <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
     </intent-filter> 
    </service> 

    <!-- END - PUSH NOTIFICATIONS WITH GOOGLE CLOUD MESSAGING (GCM) --> 

もが、あなたのPushListenerServiceに、あなたはFirebaseとAmazon MobileHubコンソールから送信されたメッセージを取得することを確認してください

/** 
* Helper method to extract SNS message from bundle. 
* 
* @param data bundle 
* @return message string from SNS push notification 
*/ 
public static String getMessage(Bundle data) { 
    // If a push notification is sent as plain text, then the message appears in "default". 
    // Otherwise it's in the "message" for JSON format. 
    String result = data.containsKey("default") ? data.getString("default") : data.getString(
      "message", ""); 
    if(result.isEmpty()){ 
     result = data.getBundle("notification").get("body").toString(); 
    } 

    return result; 
} 
関連する問題