如果我在 requestPermission 之后立即调用 Firebase 的 getToken,我会在控制台中收到错误,为啥?

Posted

技术标签:

【中文标题】如果我在 requestPermission 之后立即调用 Firebase 的 getToken,我会在控制台中收到错误,为啥?【英文标题】:If I call Firebase's getToken right after requestPermission I get an error in the console, why?如果我在 requestPermission 之后立即调用 Firebase 的 getToken,我会在控制台中收到错误,为什么? 【发布时间】:2018-04-18 23:29:35 【问题描述】:

如果我在 requestPermission 之后立即调用 Firebase 的 getToken,我会在控制台中收到错误大部分时间。这是我当前的代码:

<script src="https://www.gstatic.com/firebasejs/4.12.1/firebase-app.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.12.1/firebase-messaging.js"></script>
<script>
var config = 
apiKey: "XXXXXXXXX",
authDomain: "XXXXXXXXX.firebaseapp.com",
databaseURL: "https://XXXXXXXXX.firebaseio.com",
projectId: "XXXXXXXXX",
storageBucket: "XXXXXXXXX.appspot.com",
messagingSenderId: "XXXXXXXXX"
;
firebase.initializeApp(config);
</script>
<script>
function notification_permission() 
    messaging.requestPermission().then(function(permission) 
        console.log('Notification permission granted', permission);
        messaging.getToken().then(function(token) 
            if(token) 
                //update user token
                console.log('Token acquired', token);
             else 
                //you don't have permission to show notifications
            
        ).catch(function(err) 
            //retrieving token failed, analyze the error
            console.error('Retrieving token failed', err);
        );
    ).catch(function(err) 
        console.error('Unable to get permission to notify', err)
    );

</script>

如果浏览器已经拥有通知权限并且我调用notification_permission();,那么我会在控制台中收到令牌,而不会出现任何问题。但是,如果这是用户第一次按 Allow 来授予站点接收通知的权限,则会触发此错误(并非总是如此,但在大多数情况下):

POST https://fcm.googleapis.com/fcm/connect/subscribe 404 ()

Retrieving token failed e code: "messaging/token-subscribe-failed", message: "Requested entity was not found.", stack: "FirebaseError: Requested entity was not found."
Promise.catch (async)
Promise.then (async)
(anonymous) @ VM1243:1

任何想法为什么?谢谢!

【问题讨论】:

遇到这个问题,已经提交了支持请求,会让你知道他们说什么。如果你在 catch 中调用messaging.getToken(),你可以获得令牌:/ @RobertDaly 很棒的提示,与此同时,我想我会有一个 B 计划来获得令牌值。您能否分享支持请求的链接,以便我跟进回复?谢谢! 他们给了我一个通用的答案,说我需要链接一个应用程序,即使该呼叫在第二次被调用时仍然有效。不过在 4.13.0 中没有这个问题,如下所示! @RobertDaly 是的,新版本完全避免了这个问题! 【参考方案1】:

尝试最新版本 (4.13.0)。我在发行说明中看到了对此的修复,现在它似乎对我来说可以正常工作。https://firebase.google.com/support/release-notes/js

【讨论】:

感谢更新,我正在测试新版本。 是的,此问题已在 4.13.0 中修复。我与Version 5.8.5 确认(发布日期:2019 年 3 月 1 日)

以上是关于如果我在 requestPermission 之后立即调用 Firebase 的 getToken,我会在控制台中收到错误,为啥?的主要内容,如果未能解决你的问题,请参考以下文章

RequestPermissions 未显示对话框

离子 5 / 电容器 @capacitor/motion 坚持 DeviceMotionEvent.requestPermission

通过 requestPermissions() 请求多个权限,但 onRequestPermissionsResult 仅接收单个权限结果

requestPermissions在一个片段中

管理员不允许更改时的Android RequestPermission

Activity.requestPermissions 与 ActivityCompat.requestPermissions