使用 SNS 发送推送通知 - Expo App
Using SNS to send push notifications - Expo App
我正在创建一个将使用推送通知的 Expo 应用程序。我不想为此使用 Expo 的服务器,而是想使用 AWS SNS。这就是我所做的:
- 在 Firebase 中创建应用程序并获得 API 密钥。
- 使用步骤 1 中获得的 API 密钥在 SNS 上创建平台应用程序。
- 使用 expo 获取设备令牌。
- 在步骤 2 中创建的应用程序中的 SNS 上创建了端点。
当我尝试发送推送通知时,它不起作用。我试过了:
- 我确保使用 .getDevicePushTokenAsync() 而不是 getExpoPushTokenAsync() 来获取可用于 SNS 的设备令牌。
- 当我在我的 Android 设备上测试应用程序时,我能够 console.log 设备令牌(这是我用来添加上面第 4 步中提到的端点的东西。仍然没有 :(
- 我构建了一个独立的应用程序,下载了 .apk 文件,并将其安装在我的设备上,但现在无法检索推送令牌。我真的不知道为什么在构建应用程序并将其安装到我的设备上后它不再起作用了。它returns
我在想,如果我能够构建应用程序并获得设备令牌,我也许能够让它工作,但运气不好。知道我做错了什么或我应该做什么吗?
经过 2 天的努力,我终于做到了。我将提供我遵循的所有步骤,希望这可以帮助其他人:
- 创建一个 Firebase 项目。
- 点击“添加项目”
- 提供一个名字。点击“继续”
- 点击“创建项目”
- 项目准备就绪后,单击“继续”
- 点击“项目概览”旁边的齿轮图标
- 单击“项目设置”。
- 在出现的页面中点击云消息
- 复制“服务器密钥”的值。稍后在SNS中创建应用程序平台时将用到它。
- 在同一个“设置”页面中,单击“常规”选项卡。
- 在页面底部,您将看到“您的应用程序”部分。它应该说:“您的项目中没有应用程序”。单击 Android 的图标。
- 这是重要的一步。您需要提供“Android 包名称”。转到您的 Expo 应用并找到 android.package 的值。复制它并将其放在 Firebase 上要求 Android 包名称的位置。
- 点击“注册应用”。
- 重要的一步。单击“下载 google-services.json”按钮。
- 将文件保存在您的 EXPO 项目的根目录下。
- 返回 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 中的控制台发送测试消息来测试设置。 Select 您的端点,然后单击“发布消息”。
单击“每次交付的自定义负载”。
使用此代码:
{
"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,您可以发送两种类型的推送通知,“通知”和“数据”。在我在上面的步骤中提供的示例中,我使用的是“通知”。这样做的问题是,当您使用通知时,Expo“没有意识到正在收到通知”,这意味着您无法响应通知。 因此,如果您需要响应或解析通知中收到的响应,您需要使用“数据”类型的推送通知。
因此,在我上面给出的代码示例中,您需要将“通知”一词更改为“数据”。
除了发送“数据”推送通知而不仅仅是“通知”之外,您还必须在您的有效载荷中包含“experienceId”,您可以从您的应用程序中获取它
Defaults to Constants.manifest.id exposed by expo-constants. In the bare workflow, you must provide a value which takes the shape @username/projectSlug, where username is the Expo account that the project is associated with, and projectSlug is your slug from app.json.
您需要做的另一项更改是推送通知内容所在的部分。在我上面给出的代码中,我将它包含在一个名为“body”的 属性 中。对于“数据”类型的通知,需要更改为“消息”
此外,您添加键值对的部分也需要更改。在我上面给出的示例中属性被称为“data”,但是这次我们需要将其更改为“body”
这是生成的代码:
let dataNotification = JSON.stringify({
'data': {
'title': title,
'message': message,
'body': { your key-value-pairs},
'experienceId': "@yourExpoUsername/Your-Project-Slug"
}
});
我正在创建一个将使用推送通知的 Expo 应用程序。我不想为此使用 Expo 的服务器,而是想使用 AWS SNS。这就是我所做的:
- 在 Firebase 中创建应用程序并获得 API 密钥。
- 使用步骤 1 中获得的 API 密钥在 SNS 上创建平台应用程序。
- 使用 expo 获取设备令牌。
- 在步骤 2 中创建的应用程序中的 SNS 上创建了端点。
当我尝试发送推送通知时,它不起作用。我试过了:
- 我确保使用 .getDevicePushTokenAsync() 而不是 getExpoPushTokenAsync() 来获取可用于 SNS 的设备令牌。
- 当我在我的 Android 设备上测试应用程序时,我能够 console.log 设备令牌(这是我用来添加上面第 4 步中提到的端点的东西。仍然没有 :(
- 我构建了一个独立的应用程序,下载了 .apk 文件,并将其安装在我的设备上,但现在无法检索推送令牌。我真的不知道为什么在构建应用程序并将其安装到我的设备上后它不再起作用了。它returns
我在想,如果我能够构建应用程序并获得设备令牌,我也许能够让它工作,但运气不好。知道我做错了什么或我应该做什么吗?
经过 2 天的努力,我终于做到了。我将提供我遵循的所有步骤,希望这可以帮助其他人:
- 创建一个 Firebase 项目。
- 点击“添加项目”
- 提供一个名字。点击“继续”
- 点击“创建项目”
- 项目准备就绪后,单击“继续”
- 点击“项目概览”旁边的齿轮图标
- 单击“项目设置”。
- 在出现的页面中点击云消息
- 复制“服务器密钥”的值。稍后在SNS中创建应用程序平台时将用到它。
- 在同一个“设置”页面中,单击“常规”选项卡。
- 在页面底部,您将看到“您的应用程序”部分。它应该说:“您的项目中没有应用程序”。单击 Android 的图标。
- 这是重要的一步。您需要提供“Android 包名称”。转到您的 Expo 应用并找到 android.package 的值。复制它并将其放在 Firebase 上要求 Android 包名称的位置。
- 点击“注册应用”。
- 重要的一步。单击“下载 google-services.json”按钮。
- 将文件保存在您的 EXPO 项目的根目录下。
- 返回 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 中的控制台发送测试消息来测试设置。 Select 您的端点,然后单击“发布消息”。
单击“每次交付的自定义负载”。
使用此代码:
{
"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,您可以发送两种类型的推送通知,“通知”和“数据”。在我在上面的步骤中提供的示例中,我使用的是“通知”。这样做的问题是,当您使用通知时,Expo“没有意识到正在收到通知”,这意味着您无法响应通知。 因此,如果您需要响应或解析通知中收到的响应,您需要使用“数据”类型的推送通知。
因此,在我上面给出的代码示例中,您需要将“通知”一词更改为“数据”。
除了发送“数据”推送通知而不仅仅是“通知”之外,您还必须在您的有效载荷中包含“experienceId”,您可以从您的应用程序中获取它
Defaults to Constants.manifest.id exposed by expo-constants. In the bare workflow, you must provide a value which takes the shape @username/projectSlug, where username is the Expo account that the project is associated with, and projectSlug is your slug from app.json.
您需要做的另一项更改是推送通知内容所在的部分。在我上面给出的代码中,我将它包含在一个名为“body”的 属性 中。对于“数据”类型的通知,需要更改为“消息”
此外,您添加键值对的部分也需要更改。在我上面给出的示例中属性被称为“data”,但是这次我们需要将其更改为“body”
这是生成的代码:
let dataNotification = JSON.stringify({
'data': {
'title': title,
'message': message,
'body': { your key-value-pairs},
'experienceId': "@yourExpoUsername/Your-Project-Slug"
}
});