我试图找到一种使用Firebase Cloud Messaging向所有应用程序用户发送通知的方法,但我有一个仅限Web的应用程序。我已经看到了似乎适用于Android/iOS的解决方案,它基本上包括让用户自动订阅一个名为“allDevices”的主题,然后向订阅该主题的所有用户发送通知。我只是似乎找不到任何文档说明如何使用Web-的用户订阅一个主题。有人知道这是否可能吗?如果可能,有没有我错过的文档可以涵盖这一点?谢谢!
6ie5vjzr1#
在Firebase Cloud Messaging SDK for JavaScript中,没有直接的API来为客户端订阅主题。相反,您可以通过REST API为主题订阅令牌。调用此API需要指定FCM服务器密钥,这意味着您只能在可信环境中执行此操作,例如您的开发机器、您控制的服务器或云函数。这是必要的,因为有了FCM服务器密钥,您就可以代表应用向应用的所有用户发送消息。在我的测试中,我使用了一个旧的项目,其中客户端API键 * 是 * 允许订阅主题。出于安全原因,这个功能已经从新的项目中删除。例如,在Node.js中,您可以调用REST API为应用示例创建关系Map,如下所示:
function subscribeTokenToTopic(token, topic) { fetch('https://iid.googleapis.com/iid/v1/'+token+'/rel/topics/'+topic, { method: 'POST', headers: new Headers({ 'Authorization': 'key='+fcm_server_key }) }).then(response => { if (response.status < 200 || response.status >= 400) { throw 'Error subscribing to topic: '+response.status + ' - ' + response.text(); } console.log('Subscribed to "'+topic+'"'); }).catch(error => { console.error(error); }) }
其中fcm_server_key是FCM服务器密钥,取自项目的Firebase控制台。
fcm_server_key
更新:订阅FCM标记主题的选项现在也是Firebase Admin SDK的一部分,这使得在受支持的环境中更容易做到这一点。有关详细信息,请参阅subscribing the client app to a topic/
628mspwn2#
任何一个寻找PHP解决方案的人找到下面,因为你要使用服务器的API密钥,所以不要在客户端这样做客户端fire base js代码
// Initialize Firebase var config = { apiKey: "xxxx", authDomain: "yyy", databaseURL: "zzzz", projectId: "aaaa", storageBucket: "bbbbb", messagingSenderId: "ccc" }; firebase.initializeApp(config); const messaging = firebase.messaging(); messaging.requestPermission() .then(function() { console.log('Notification permission granted.'); return messaging.getToken(); }) .then(function(token) { //send this token to server console.log(token); // Display user token }) .catch(function(err) { // Happen if user deney permission console.log('Unable to get permission to notify.', err); }); messaging.onMessage(function(payload){ console.log('onMessage',payload); })
服务器端代码由php curl
$headers = array ('Authorization: key=' . API_ACCESS_KEY, 'Content-Type: application/json'); $ch = curl_init(); // browser token you can get it via ajax from client side $token = 'drVdtCt82qY:APA91bEZb99GvoS9knv-cp5ThVBiYGBjUwl_Ewj2tKaRFwp7HoG347utaNKbgLWmkxpGadABtIg-DspPUh5sC_bc2JrBKVw10Ejg72nYxZgD2wBU-adYJo0yi03lX22s5K2UEp6gwnMv'; curl_setopt($ch, CURLOPT_URL, "https://iid.googleapis.com/iid/v1/$token/rel/topics/testIshakTopic"); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_POSTFIELDS, array()); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($ch); echo "The Result : " . $result;
希望对PHP开发人员有所帮助
mlmc2os53#
弗兰克斯的解决方案仍然有效。但是,你需要有一个服务器为你做订阅。
function subscribeTokenToTopic(token, topic) { fetch('https://myserver.com/'+token+'/rel/topics/'+topic, { method: 'POST', headers: new Headers({ 'Authorization': 'Bearer '+ oauthToken }) }).then(response => { if (response.status < 200 || response.status >= 400) { throw 'Error subscribing to topic: '+response.status + ' - ' + response.text(); } console.log('Subscribed to "'+topic+'"'); }).catch(error => { console.error(error); }) }
那么你的服务器会有一个类似这样的休息调用:(java Spring )
@RequestMapping(value = "/{token}/rel/topics/{topic}", method = RequestMethod.POST) public ResponseEntity<?> subscribeTokenToTopic(@PathVariable("token") String token, @PathVariable("topic") String topic) throws ServletException { URL url = new URL("https://iid.googleapis.com/iid/v1/"+token+"/rel/topics/"+topic); // make https post call here.. ... }
希望这是有道理的。
cl25kdpy4#
import firebase from 'firebase/app'; import 'firebase/messaging'; const config = { apiKey: "xxxx", authDomain: "xxx", databaseURL: "xxx", projectId: "xxx", storageBucket: "xxxx", messagingSenderId: 'xxxxx', appId: 'xxxxx', measurementId: 'xxxxxx' }; firebase.initializeApp(config); try { if (firebase.messaging.isSupported()) { const messaging = firebase.messaging(); messaging .getToken({ vapidKey: VAPID_KEY }) .then((currentToken) => { if (currentToken) { subscribeTokenToTopic(currentToken,FirebaseAdminTopic); } }) .catch((err) => { console.log('Error to get token', err); }); messaging.onMessage((payload) => { console.log(payload.notification) }); // Otherwise, we need to ask the user for permission if (Notification.permission !== 'granted') { Notification.requestPermission(); } } else { console.log('firebase messaging not supported'); } } catch (err) { console.log(err); } function subscribeTokenToTopic(token, topic) { fetch(`https://iid.googleapis.com/iid/v1/${token}/rel/topics/${topic}`, { method: 'POST', headers: new Headers({ Authorization: `key=${FCM_SERVER_KEY}` }) }) .then((response) => { if (response.status < 200 || response.status >= 400) { console.log(response.status, response); } console.log(`"${topic}" is subscribed`); }) .catch((error) => { console.error(error.result); }); return true; }
nxagd54h5#
使用服务器密钥而不是配置。apiKey工作正常。
5条答案
按热度按时间6ie5vjzr1#
在Firebase Cloud Messaging SDK for JavaScript中,没有直接的API来为客户端订阅主题。相反,您可以通过REST API为主题订阅令牌。调用此API需要指定FCM服务器密钥,这意味着您只能在可信环境中执行此操作,例如您的开发机器、您控制的服务器或云函数。这是必要的,因为有了FCM服务器密钥,您就可以代表应用向应用的所有用户发送消息。
在我的测试中,我使用了一个旧的项目,其中客户端API键 * 是 * 允许订阅主题。出于安全原因,这个功能已经从新的项目中删除。
例如,在Node.js中,您可以调用REST API为应用示例创建关系Map,如下所示:
其中
fcm_server_key
是FCM服务器密钥,取自项目的Firebase控制台。更新:订阅FCM标记主题的选项现在也是Firebase Admin SDK的一部分,这使得在受支持的环境中更容易做到这一点。有关详细信息,请参阅subscribing the client app to a topic/
628mspwn2#
任何一个寻找PHP解决方案的人找到下面,因为你要使用服务器的API密钥,所以不要在客户端这样做
客户端fire base js代码
服务器端代码由php curl
希望对PHP开发人员有所帮助
mlmc2os53#
弗兰克斯的解决方案仍然有效。但是,你需要有一个服务器为你做订阅。
那么你的服务器会有一个类似这样的休息调用:
(java Spring )
希望这是有道理的。
cl25kdpy4#
nxagd54h5#
使用服务器密钥而不是配置。apiKey工作正常。