使用 SNS 发送推送通知 - Expo App

Posted

技术标签:

【中文标题】使用 SNS 发送推送通知 - Expo App【英文标题】:Using SNS to send push notifications - Expo App 【发布时间】:2020-11-09 21:54:59 【问题描述】:

我正在创建一个使用推送通知的 Expo 应用程序。我不想为此使用 Expo 的服务器,而是想使用 AWS SNS。这就是我所做的:

    在 Firebase 中创建了应用并获得了 API Key。 使用步骤 1 中获得的 API 密钥在 SNS 上创建了平台应用程序。 使用 expo 获取设备令牌。 在步骤 2 中创建的应用程序中的 SNS 上创建了一个端点。

当我尝试发送推送通知时,它不起作用。我试过了:

我确保使用 .getDevicePushTokenAsync() 而不是 getExpoPushTokenAsync() 来获取可用于 SNS 的设备令牌。 当我在我的 android 设备上测试应用程序时,我能够控制台记录设备令牌(这是我用来添加上面第 4 步中提到的端点的东西。仍然没有:( 我构建了一个独立的应用程序,下载了 .apk 文件,将其安装在我的设备上,但现在没有检索到推送令牌。我真的不知道为什么在构建应用程序并将其安装在我的设备上之后,它不再起作用了。它返回

我在想,如果我能够构建应用程序并获得设备令牌,我也许可以让它工作,但没有运气。知道我做错了什么或应该做什么吗?

【问题讨论】:

【参考方案1】:

经过 2 天的努力,我终于做到了。我将提供我遵循的所有步骤,希望这可以帮助其他人:

    创建一个 Firebase 项目。 点击“添加项目” 提供一个名称。点击“继续” 点击“创建项目” 项目准备就绪后,点击“继续” 点击“项目概述”旁边的齿轮图标 点击项目设置。 在显示的页面中单击云消息传递 复制“服务器密钥”的值。稍后在 SNS 中创建应用平台时会用到它。 在同一个“设置”页面中,单击“常规”选项卡。 在页面底部,您将看到“您的应用程序”部分。它应该说:“您的项目中没有应用程序”。点击 Android 图标。 这是重要的一步。您需要提供“Android 包名称”。转到您的 Expo 应用程序并找到 android.package 的值。复制它并将其放在 Firebase 上要求 Android 软件包名称的位置。 点击“注册应用”。 重要步骤。点击“下载 google-services.json”按钮。 将文件保存在您的世博项目的根目录中。 返回到您的 Expo 项目中的 app.json 文件。如果它具有 android 值,请确保这是您至少拥有的:
"android": 
      "googleServicesFile": "./google-services.json",
      "package": "com.astest.mypackage",
      "useNextNotificationsApi": true
 ,

    按照说明here 设置您的客户端应用程序。确保您不包含 sendPushNotification() 函数,因为您实际上将使用 SNS。

    在 registerForPushNotificationsAsync() 函数中,确保使用 .getDevicePushTokenAsync() 而不是 .getExpoPushTokenAsync()

    在 SNS 中创建平台应用程序

推送通知平台:选择FCM

    在您的代码中,确保您在 SNS 中创建了一个应用程序端点。或者通过控制台进行。

    通过使用 SNS 中的控制台发送测试消息来测试设置。选择您的端点,然后点击“发布消息”。

    点击“每次交付的自定义有效负载”。

    使用此代码:


  "GCM": " \"notification\": \"title\": \"Title of notification\", \"body\": \"It works\"  "

    点击发布消息。

    要以编程方式发布消息,您可以:

var sns = new AWS.SNS( apiVersion: '2010-03-31', region: 'us-east-1')
    
        let notification = JSON.stringify(
            'notification': 
                'title': "title of notification",
                'body': "Your message goes here",
                'data': 
            
        );
    
    
        var params = 
            Message: JSON.stringify(
                GCM: notification
            ),
            MessageStructure: "json",
            TargetArn: "###Your Target ARN##"
        ;
    
        sns.publish(params, function(err, data) 
            if (err) 
                console.log("There was an error sending the push notification----> ", err)
             // an error occurred
            else
                console.log("Push notification sent successfully!!!! ", data);
                            // successful response
        );

现在,这当然只适用于 Android。但它有效!让它适应 APN 应该不会太难。

编辑 1 如果您希望您的 Expo、托管流程、应用程序响应您发送的通知,您需要进行一些更改。我花了最后 3 天的时间试图弄清楚这一点,我终于做到了。

根据 Expo documentation,您可以发送两种类型的推送通知,“通知”和“数据”。在我在上述步骤中提供的示例中,我使用的是“通知”。问题在于,当您使用通知时,世博会“没有意识到正在收到通知”,这意味着您无法响应通知。 因此,如果您需要响应或解析在通知中收到的响应,您需要使用“数据”类型的推送通知。

因此,在我上面给出的代码示例中,您需要将“通知”一词更改为“数据”。

除了发送“数据”推送通知而不仅仅是“通知”之外,您必须在您的有效负载中包含“experienceId”,您可以从您的应用中获取该信息

默认为由 expo-constants 公开的 Constants.manifest.id。在裸工作流中,您必须提供一个采用 @username/projectSlug 形式的值,其中 username 是与项目关联的 Expo 帐户,projectSlug 是您来自 app.json 的 slug。

您需要进行的另一项更改是推送通知的内容所在的部分。在我上面给出的代码中,我将它包含在一个名为“body”的属性中。对于“数据”类型的通知,需要更改为“消息”

此外,您添加键值对的部分也需要更改。在我上面给出的示例中,该属性称为“数据”,但这次我们需要将其更改为“正文”

这是生成的代码:

let dataNotification = JSON.stringify(
            'data': 
                'title': title,
                'message': message,
                'body':  your key-value-pairs, 
                'experienceId': "@yourExpoUsername/Your-Project-Slug"
            
        );

【讨论】:

有用!谢谢你。我似乎无法开始工作的唯一一件事就是传递自定义数据。似乎它应该像在字符串化之前将项目添加到该数据字典一样简单,但它对我不起作用。对此有何建议? 当我输入这个时,我实际上正在处理它。我正在使用 Expo 令牌对其进行测试,并且只需在“数据”中添加我的 JSON 即可成功传递数据。 是的,我认为这也是我正在做的事情。 ` const notificationDict = title:'标题', body: '消息的正文', android_channel_id:'aChannelIdIamUsing', data: gameIdentifier: 'passingAgameIdLikeThis' const notification = JSON.stringify('notification': notificationDict) var params = Message: JSON.stringify( GCM: notification ), MessageStructure: 'json', TargetArn: arn ; ` 始终记得在新构建之前清理 android 项目 - defaultSenderId 和 google_api_key 将有旧值没有那个。 描述准确!我的问题是我收到了通知,但是当在后台触发通知时它们显示为空。将 MessageStructure 设置为 json 就可以了。还必须更新以使用“数据”类型的通知在正文中发送自定义数据。

以上是关于使用 SNS 发送推送通知 - Expo App的主要内容,如果未能解决你的问题,请参考以下文章

使用 Amazon SNS 服务发送推送通知

使用 AWS SNS 向特定 APNS 令牌发送推送通知

如何在 nodejs 中使用 FCM 发送 AWS SNS 推送通知?

如何从 laravel 向 expo 应用程序发送推送通知

设置 AWS SNS 以向 iOS 设备发送推送通知

AWS SNS 推送通知说明