如何在React Native Amplify应用中实现社交请求类推送通知?
实现基于Amplify的跨平台推送通知(好友请求场景)
Amplify的Push Notification模块确实侧重客户端接收逻辑,发送推送需要结合后端Lambda、Amazon SNS以及用户设备令牌的存储来实现,以下是针对好友请求/接受场景的具体方案:
1. 前置准备:客户端设备令牌存储
首先确保iOS/Android客户端已完成Amplify Push Notification的基础配置,关键是获取设备令牌后,将其关联到用户并存储:
- 客户端注册推送成功后,拿到APNS(iOS)或FCM(Android)的设备令牌。
- 将令牌存储到Cognito User Pool的用户自定义属性(比如
device_token),或者在Amplify DataStore中创建Device模型(关联userId、token、platform字段)。
2. 触发推送的后端事件监听
利用Amplify Functions(Lambda)监听好友请求相关的数据库事件:
- 定义
FriendRequestDataStore模型,包含senderId、receiverId、status(如PENDING/ACCEPTED)、senderName、receiverName等字段。 - 为
FriendRequest模型配置Lambda触发器:- 当
FriendRequest被创建(用户发送好友请求)时触发。 - 当
FriendRequest的status更新为ACCEPTED(用户接受请求)时触发。
- 当
3. Lambda中实现推送发送逻辑
在Lambda函数中,根据事件类型获取目标用户,查询其设备令牌,再调用SNS发送推送:
示例代码(Node.js)
const AWS = require('aws-sdk'); const sns = new AWS.SNS(); const cognito = new AWS.CognitoIdentityServiceProvider(); exports.handler = async (event) => { const friendRequest = event.detail.data; let targetUserId, notificationMessage; // 判断触发场景 if (event.detail.event === 'create') { // 发送好友请求:通知接收者 targetUserId = friendRequest.receiverId; notificationMessage = `${friendRequest.senderName} 向你发送了好友请求`; } else if (event.detail.event === 'update' && friendRequest.status === 'ACCEPTED') { // 接受好友请求:通知发送者 targetUserId = friendRequest.senderId; notificationMessage = `${friendRequest.receiverName} 接受了你的好友请求`; } else { return { status: 'no action needed' }; } // 查询目标用户的设备令牌(从Cognito User Pool属性中获取) const user = await cognito.adminGetUser({ UserPoolId: process.env.USER_POOL_ID, Username: targetUserId }).promise(); const deviceTokens = user.UserAttributes .filter(attr => attr.Name === 'device_token') .map(attr => attr.Value); // 遍历令牌发送推送 for (const token of deviceTokens) { let platformArn, messagePayload; // 区分iOS/Android平台 if (token.startsWith('APA91b')) { // Android FCM令牌特征前缀 platformArn = process.env.ANDROID_SNS_PLATFORM_ARN; messagePayload = JSON.stringify({ GCM: JSON.stringify({ notification: { title: '好友通知', body: notificationMessage } }) }); } else { // iOS APNS令牌 platformArn = process.env.IOS_SNS_PLATFORM_ARN; messagePayload = JSON.stringify({ APNS: JSON.stringify({ aps: { alert: { title: '好友通知', body: notificationMessage }, sound: 'default' } }) }); } // 调用SNS发送推送 await sns.publish({ TargetArn: `${platformArn}/endpoint/${token}`, Message: messagePayload, MessageStructure: 'json' }).promise(); } return { status: 'notifications sent' }; };
4. 配置SNS平台应用
在AWS控制台完成SNS的平台配置:
- 创建iOS平台应用:上传APNS推送证书(开发/生产环境),获取平台ARN。
- 创建Android平台应用:配置FCM服务器密钥,获取平台ARN。
- 将这两个ARN作为环境变量注入到Lambda函数中(如示例中的
ANDROID_SNS_PLATFORM_ARN和IOS_SNS_PLATFORM_ARN)。
5. 权限配置
确保Lambda函数拥有必要的权限:
- 为Lambda添加Cognito
adminGetUser权限,用于查询用户的设备令牌。 - 为Lambda添加SNS
Publish权限,允许向平台端点发送推送。 - 这些权限可以通过Amplify的
amplify update function命令,在IAM策略配置中添加对应规则。
内容的提问来源于stack exchange,提问作者Rajan Sharma
相关产品推荐
相关产品推荐

