【问题标题】:RNFirebase Messaging: Issue Sending Device Token in TimeRNFirebase 消息传递:及时发送设备令牌
【发布时间】:2025-12-16 22:45:02
【问题描述】:

我在及时上传设备令牌时遇到问题。问题似乎是因为如果没有足够快地授予权限,我的数据库不会更新任何内容。但是当我重新启动应用程序时(在授予权限后),设备令牌会按预期上传到我的数据库。

这是我正在使用的代码,它在componentWillMount() 时运行。

FCM = firebase.messaging(); 
DB = firebase.database().ref('deviceTokens/'); 

  getPushToken() {
    FCM.requestPermissions();
    FCM.getToken().then(token => {
      DB.push(token);
     });

  }

无论如何我可以解决这个问题吗?我不希望用户在授予权限后必须重新启动应用程序才能获得设备令牌。

【问题讨论】:

    标签: firebase react-native firebase-cloud-messaging react-native-ios react-native-firebase


    【解决方案1】:

    requestPermissions方法返回promise所以你需要等到函数完成它工作或失败,有两种方法可以解决你的问题

    #1 : 使用等待

    try{
        await FCM.requestPermissions();
        FCM.getToken().then(token => {
            DB.push(token);
        });
    }catch(e){/*DO SOMETHING*/}
    

    #2 : 使用 then 方法

    FCM.requestPermissions().then(() => {
        FCM.getToken().then(token => {
            DB.push(token);
         });
    }).catch(e => {/*DO SOMETHING*/} );
    

    【讨论】:

      【解决方案2】:

      授予权限需要与用户进行交互,这需要时间。所以你不能仅仅假设在你调用requestPermissions()之后权限就在那里。相反,您必须等待授予权限,然后获取令牌。

      你通过等待requestPermissions返回的承诺来做到这一点:

      FCM = firebase.messaging(); 
      DB = firebase.database().ref('deviceTokens/'); 
      
      getPushToken() {
        FCM.requestPermissions().then(() => {
          FCM.getToken().then(token => {
            DB.push(token);
           });
        });
      }
      

      【讨论】: