You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)监听好友请求相关的数据库事件:

  • 定义FriendRequest DataStore模型,包含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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 18:23:21