Expo react-native 裸工作流使用推送通知

Posted

技术标签:

【中文标题】Expo react-native 裸工作流使用推送通知【英文标题】:Expo react-native bare workflow using Push notifications 【发布时间】:2020-06-02 19:14:44 【问题描述】:

首先,我将非常感谢您的帮助。 我正在尝试使用 expo-bare 工作流来实现 expo 推送通知。当我运行应用程序时,它给了我这样的错误,所以我无法获得令牌。 错误[TypeError: null is not an object (evaluating '_ExponentNotifications.default.getExponentPushTokenAsync')]

这是我的代码:

import  Notifications  from "expo";
import * as Permissions from "expo-permissions";
import Constants from "expo-constants";

export const getToken = async () => 
  if (Constants.isDevice) 
    const  status: existingStatus  = await Permissions.getAsync(Permissions.NOTIFICATIONS);
    let finalStatus = existingStatus;
    if (existingStatus !== "granted") 
      const  status  = await Permissions.askAsync(Permissions.NOTIFICATIONS);
      finalStatus = status;
    
    if (finalStatus !== "granted") 
      console.log("Failed to get push token for push notification!");
      return;
    
    token = await Notifications.getExpoPushTokenAsync();
  
  else 
    console.log("Must use physical device for Push Notifications");
  
  return token;
;

【问题讨论】:

裸工作流使用 expo-notifications 包 - github.com/expo/expo/tree/master/packages/expo-notifications 我按照您评论的指示进行操作,先生。也许我可以尝试你在下面分享代码的方式,我会通知你。谢谢你的帮助先生。 【参考方案1】:

你需要安装expo通知包:

expo install expo-notifications 也不要忘记将cd 放入ios 文件夹并运行pod install 以正确链接包。

接下来,您需要更改导入和使用通知的方式,例如:

import * as Notifications from 'expo-notifications';

然后要获得博览会令牌,您可以执行以下操作:

Notifications.getExpoPushTokenAsync(experienceId:'@your_username/your_app_slug')

这将解析为包含您的 expo 令牌的承诺,其对象格式如下:

"data": "ExponentPushToken[ID]", "type": "expo"

注意:来自 expo 的通知中的大多数方法支持与 expo-notifications 中的不同。详情请查看here。

【讨论】:

【参考方案2】:

为了扩展我的评论,当我参加世博会时,我的设置与您的设置相似,但我退出了。根据their docs,裸工作流有点不同,所以我的设置是这样的:

// at the top:

import * as Notifications from 'expo-notifications';

// --------

// inside the code:

let settings = false

settings = Notifications.getPermissionsAsync()

if (!settings.granted) 
  settings = Notifications.requestPermissionsAsync()


if (settings.status === 1 || settings.status === 'granted') 
  const experienceId = '@proj/example' // (see docs on using expo credentials:manager)
  const token = Notifications.getExpoPushTokenAsync( experienceId )

  const resp = api.sendNotificationToken( token: token.data )


【讨论】:

先生,您能否解释一下我如何获得 experienceId 它在哪里? 现在我正确获得了 expo 令牌,但是当我尝试使用 expo 工具发送推送通知时,它显示“InvalidCredentials:无法检索收件人应用程序的 FCM 服务器密钥。确保您提供了服务器密钥按照 Expo FCM 文件的指示。”我将我的 FCM 凭据上传到世博会我不知道为什么会出现此错误。 对于 android,您需要按照指南设置 Firebase 消息传递密钥,并通过 expo 凭据管理器上传 我将我的 FCM 密钥上传到了展会。现在我得到了 expo 令牌,然后我通过 expo 工具发送了通知,但我没有收到通知。 非常感谢您的支持。我完成的解决方案是删除世博会推送通知,而不是世博会,我决定使用 react-native-firebase 云消息传递库。我遵循 react-native-firebase 安装,everythink 运行良好。世博会害死我,在未来的项目中我永远不会使用世博会:)

以上是关于Expo react-native 裸工作流使用推送通知的主要内容,如果未能解决你的问题,请参考以下文章

expo-updates 如何在反应原生裸工作流应用程序的不同版本中工作?

Expo / React Native:弹出到裸工作流后找不到图像文件

如何在 IOS 设备上的裸工作流中测试我的 expo 应用程序?

expo React-native 数据未呈现但登录控制台

expo 应用程序中的 React-native 安装问题

Expo React-Native iOS 模拟器不工作