您如何识别 Expo Push Notification Token 所属的 Expo 项目?

Posted

技术标签:

【中文标题】您如何识别 Expo Push Notification Token 所属的 Expo 项目?【英文标题】:How do you identify the Expo project that an Expo Push Notification Token belongs to? 【发布时间】:2020-04-19 14:45:40 【问题描述】:

前提

无论好坏,我将两个 Expo 帐户用于我的生产和开发环境。

Production  Expo Account: prod-proj
Development Expo Account: dev-proj

我使用 Expo 的推送通知服务向我的用户发送推送通知。我将每个用户的 Expo Push Notification Token 存储在他们的用户文档中。即:

User
  id:    1
  name:  Jimothy
  token: ExponentPushToken[di3ja!-lk2^(24af]

通过一系列不幸的事件,我数据库中的大多数用户都使用prod-proj Expo 项目创建了推送通知,但少数用户使用dev-proj 创建了推送通知。


问题

当我尝试分块并向我的所有用户发送推送通知时,我从 Expo 收到一个错误:

错误:同一个请求中的所有推送通知消息必须是针对同一个项目的;按项目分隔您的推送通知。

但是我的代币都搞混了!

如何按项目区分 Expo Push Notification Tokens?

【问题讨论】:

【参考方案1】:

想出了这个问题的答案!

在 Expo 的expo-server-sdk Node 客户端中,Expo 返回错误的details 字段包含有关哪些令牌属于哪些项目的所有信息。

示例代码

const  Expo  = require('expo-server-sdk');

const expo = new Expo();

const sendNotifications = async () => 

  const notifications = [ ... ];
  const chunks = expo.chunkPushNotifications(notifications);

  for (const chunk of chunks) 

    try 
      await expo.sendPushNotificationsAsync(chunk)
     

    catch (error) 
      console.log(JSON.stringify(error));

      // The important part:
      // error.details =  EXPO_PROJECT_NAME: [ ExponentPushTokens ] 
    
  

【讨论】:

【参考方案2】:

我现在面临同样的问题,我们能做的最好的事情可能就是将 expo 推送令牌与体验 ID 一起发送到后端。从那里,按经验对令牌进行分组,然后像往常一样发送这些组。

import Constants from "expo-constants";
const experienceId = Constants.manifest.id; // @user/project-slug

【讨论】:

以上是关于您如何识别 Expo Push Notification Token 所属的 Expo 项目?的主要内容,如果未能解决你的问题,请参考以下文章

Expo Push Notifications - 在特定屏幕中禁用通知

通知面板 UI 设计问题 - Expo Push Notifications

Expo如何管理一千个推送通知的FCM令牌?

开玩笑在 Expo 上运行时无法识别 .jsx 文件

如何修复安装 expo-cli

您能否在具有苹果 2 因素身份验证的 CI 环境中使用“expo build:ios”以及如何