0

我正在構建需要能夠接收推送通知的Chrome擴展程序。另一種選擇是每隔X秒輪詢一次服務器,但這看起來並不是一個很好的選擇。爲此,我選擇了Firebase。自定義的JWT令牌認證似乎已完成並正在運行。下一步是獲取註冊令牌,並將其發送到服務器。Chrome擴展程序和FCM提取註冊令牌

問題:

令牌似乎永遠是牽強:

var config = { 
    apiKey: "<KEY>", 
    authDomain: "<DOMAIN>", 
    messagingSenderId: "<SENDER_ID>" 
}; 
var app = firebase.initializeApp(config); 
var messaging = firebase.messaging(app); 

function initApp() { 
    firebase.auth().onAuthStateChanged(function(user) { 
     if(user) { 
      // Update UI 
      fetchToken(); 
     } else { 
      // no user is signed in 
     } 
    }); 
} 

function fetchToken() { 
    messaging.requestPermission() 
     .then(function() { 
      messaging.getToken() 
       .then(function(currentToken) { 
        if (currentToken) { 
         sendRegistrationTokenToServer(currentToken); 
        } else { 
         console.log('No token available') 
        } 
       }) 
       .catch(function(err) { 
        console.debug('An error occurred while retrieving token. ', err); 
       }); 
    }).catch(function(err) { 
     console.log('Notification permissions denied.', err); 
    }); 


    firebase.messaging().onTokenRefresh(function() { 
     messaging.getToken() 
      .then(function(refreshedToken) { 
       sendRegistrationTokenToServer(refreshedToken); 
       console.log('Token refreshed') 
      }) 
      .catch(function(err) { 
       console.log('Unable to retrieve refreshed token', err); 
      }); 
    }); 
} 

$(document).ready(function() { 
    initApp(); 

    // some other stuff 
}); 

有誰知道爲什麼令牌是不是牽強?

開發人員控制檯中無法看到網絡活動(用於獲取令牌)。也沒有打印錯誤。不過,我確實看到getAccountInfo?key=<somekey>的網絡活動,它帶有一個idToken,雖然我不確定這是一個相關的請求(響應似乎沒有返回令牌)。

+0

我遇到同樣的問題。它是'requestPermission'不返回任何東西。 –

回答

0

針對網絡的FCM需要使用服務工作人員,據我所知,Chrome擴展程序/應用程序不支持該服務工作人員。

雖然你應該看到一些錯誤。

0

問題是你不能從後臺腳本中調用messaging.requestPermission()。如果用戶不允許通知,則此呼叫將嘗試提示用戶,這將失敗。你可以做的是要求通知權限別的地方在你的擴展,它有一個用戶界面(例如,您的選項頁):

Notification.requestPermission().then((permission) => { ... 

一旦用戶允許的權限,你可以使用Permissions API,如果你要查詢獲得許可,代替撥打messaging.requestPermission()的電話。這是我寫的做這樣的功能:

/** 
* Determine if navigator Notifications permission has been granted 
* Note: this will work from the background script of an extension, 
* unlike the other solutions 
* @see https://developers.google.com/web/updates/2015/04/permissions-api-for-the-web 
* @see https://w3c.github.io/permissions/ 
* @see https://www.chromestatus.com/features/6443143280984064 
* @returns {Promise<boolean>} true if granted 
* @memberOf app.Notify 
*/ 
hasNavigatorPermission: function() { 
    return navigator.permissions.query({ 
    name: 'notifications', 
    }).then((status) => { 
    if (status.state === 'granted') { 
     return Promise.resolve(true); 
    } 
    return Promise.resolve(false); 
    }); 
}, 

而且使用這樣的:其他

/** 
* Get the registration token for fcm 
* @returns {Promise<token>} A registration token for fcm 
* @memberOf app.Fb 
*/ 
getRegToken: function() { 
    return app.Notify.hasNavigatorPermission().then((granted) => { 
    if (!granted) { 
     return Promise.reject(new Error(ERROR_NOTIFICATIONS)); 
    } 
    return _messaging.getToken(); 
    }).then((token) => { 
    if (token) { 
     return Promise.resolve(token); 
    } 
    return Promise.reject(new Error(ERROR_TOKEN)); 
    }); 
}, 

幾件事情要注意:

不要在擴展依靠Notification.permission 。它沒有正確的值。

Chrome 59開始,如果您在開發過程中多次關閉通知對話框,它將停止顯示一段時間。您需要清除瀏覽器數據才能使其重新開始顯示。