直接在亚马逊SNS上注册设备ID

11
我正在使用Amazon Web Service直接向设备发送推送通知。在安装应用程序后,我会得到需要手动添加到Amazon SNS的设备ID。我想知道是否有任何方式可以在用户启动应用程序的同时直接向Amazon服务器注册设备ID。
我已经阅读了此文档,但是发现它很难理解。有没有人有过如何做到这一点的经验? 编辑2(我迄今为止所做的) 我按照这个链接的说明操作。
  1. 我按照说明下载了snspobilepush.zip文件,并将其导入到eclipse中。 添加GCM项目编号,添加jar文件并运行应用程序。 我得到了我的设备注册ID。

  2. 我打开Amazon SNS,添加我的设备ID并发布消息。 我在手机上收到了消息。 到目前为止都很好。

    我的问题

我将拥有许多潜在的应用程序用户。因此,手动将每个设备ID添加到SNS毫无意义。 我需要Amazon SNS在我启动应用程序时直接注册我的设备ID。 我是否有任何选项可以这样做?我在文档中找不到明确的答案。 此链接告诉我使用"AWS令牌售货服务"。 但是,我找不到如何执行此操作的示例。
3个回答

11

使用这里记录的AmazonSNSClient:

http://docs.aws.amazon.com/AWSAndroidSDK/latest/javadoc/

应该可以使用类似以下代码进行注册:

AWSCredentials awsCredentials = new BasicAWSCredentials("XXXXXX", "XXXXXXXXXXXXXXX");
String platformApplicationArn = "arn:aws:sns:us-east-1:123456789:app/GCM/myappname";
AmazonSNSClient pushClient = new AmazonSNSClient(awsCredentials);

String customPushData = "my custom data";
CreatePlatformEndpointRequest platformEndpointRequest = new CreatePlatformEndpointRequest();
platformEndpointRequest.setCustomUserData(customPushData);
platformEndpointRequest.setToken(pushNotificationRegId);
platformEndpointRequest.setPlatformApplicationArn(platformApplicationArn);
CreatePlatformEndpointResult result = pushClient.createPlatformEndpoint(platformEndpointRequest);
Log.w(TAG, "Amazon Push reg result: " + result);

它不喜欢我的ARN,但那是Reid指出的一个愚蠢的打字错误,现在已经在上面修复了。


我来自PH,虽然我的互联网可能是通过AUS路由的(办公室设置,不要问),但我不明白为什么只有在我在美国东部创建我的SNS应用程序时才能正常工作。可能会就此提出不同的问题,但既然这个方法有效,那么它应该被接受为答案。 - josephus
我用自己的 platformApplicationArn 替换了我的。 - josephus
如果其他人像我一样遇到了区域错误,请手动在SNSClient上设置区域,这是我的解决方法: pushClient.setRegion(Region.getRegion(Regions.US_WEST_2)); - Reid L Skipworth
我使用了上面的代码和我的凭据,但是出现了一个错误:MissingAuthenticationToken。我已经检查了凭据,它们与亚马逊给我的凭据相对应... 你有任何想法在哪里可以获取这个令牌吗? - Caroline
@josephus,'pushNotificationRegId'是什么?我在我的代码中无法解决它。 - dmSherazi

1
这适用于Firebase和Cognito。需要使用AsyncTask来避免在主线程上运行。
private class RegisterIdForAWS extends AsyncTask<String, Void, Void> {

        private Exception exception;

        protected Void doInBackground(String... urls) {
            try {
                String pushNotificationRegId = FirebaseInstanceId.getInstance().getToken();

                if (pushNotificationRegId != null) {

                    CognitoCachingCredentialsProvider provider = new CognitoCachingCredentialsProvider(
                            getApplicationContext(),
                            "us-west-2:aaaaaaaaa-1234-1234-1234-0bbbbbbbbbbbb",
                            Regions.US_WEST_2);
                    String platformApplicationArn = "arn:aws:sns:us-west-2:123456789:app/GCM/appname";
                    AmazonSNSClient pushClient = new AmazonSNSClient(provider);
                    pushClient.setRegion(Region.getRegion(Regions.US_WEST_2));

                    String customPushData = "";
                    CreatePlatformEndpointRequest platformEndpointRequest = new CreatePlatformEndpointRequest();
                    platformEndpointRequest.setCustomUserData(customPushData);
                    platformEndpointRequest.setToken(pushNotificationRegId);
                    platformEndpointRequest.setPlatformApplicationArn(platformApplicationArn);
                    CreatePlatformEndpointResult result = pushClient.createPlatformEndpoint(platformEndpointRequest);
                    Log.w(TAG, "Amazon Push reg result: " + result);
                }
            } catch (Exception e) {
                this.exception = e;
            }

            return null;
        }

        protected void onPostExecute(String text) {
            Log.w(TAG, "Amazon Push reg Finished");
        }
    }

1

5
我已经浏览了那两个链接,感觉自己像在打圈。这些说明文档非常不清晰。 - Anirudh
请问您能否分享一下您目前尝试过的代码?您遇到了哪些错误? - TeaCupApp
你好!代码运行良好,没有出现任何错误。我只需要直接将设备ID注册到亚马逊服务器上,但我无法做到这一点(而不是手动添加)。我已经编辑了我的问题以包括这个。请看一下。谢谢! - Anirudh
我处理这个问题的方式是通过我的后端php代码来实现。然而,由于我知道这可以通过AwsSDK完成,就像我给你发送的链接一样。这只是一个需要经历的学习曲线。请查看IAM角色,因为您的SDK需要凭据才能与Amazon资源通信。 - TeaCupApp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接