如何使用 Firebase 云消息传递通过 Web 浏览器订阅主题

新手上路,请多包涵

我正在尝试找到一种使用 Firebase Cloud Messaging 向我的应用程序的所有用户发送通知的方法,但我有一个仅限网络的应用程序。我见过似乎适用于 Android/iOS 的解决方案,它基本上涉及让用户自动订阅名为“allDevices”的主题,然后向订阅该主题的所有用户发送通知。我似乎找不到任何关于如何让基于 Web 的用户订阅主题的文档。有谁知道这是否可能,如果可能,是否有我错过的文档可以涵盖这一点?

谢谢!

原文由 Derek 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 719
2 个回答

在适用于 JavaScript 的 Firebase 云消息传递 SDK 中,没有直接的 API 可以让客户端订阅主题。相反,您可以通过 REST API 为主题订阅令牌。调用此 API 需要您指定 FCM 服务器密钥,这意味着您应该只在受信任的环境中执行此操作,例如您的开发机器、您控制的服务器或 Cloud Functions。这是必要的,因为拥有 FCM 服务器密钥允许代表您的应用向您应用的所有用户发送消息。

事实证明,在我的测试中,我使用的是一个较旧的项目,其中 允许 客户端 API 密钥订阅主题。出于安全原因,此功能已从较新的项目中删除。

例如,在 Node.js 中,您可以调用 REST API 来 为应用程序实例创建关系映射, 如下所示:

 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 令牌主题的选项现在也是大多数 Firebase Admin SDK 的一部分,这使得在支持的环境中更容易做到这一点。有关更多信息,请参阅有关将 客户端应用程序订阅到主题的 文档 /

原文由 Frank van Puffelen 发布,翻译遵循 CC BY-SA 4.0 许可协议

任何寻找 php 解决方案的人都可以在下面找到,因为您将使用服务器的 Api 密钥,所以不要在客户端执行此操作

客户端火力基础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开发者有所帮助

原文由 Ishak Ali 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题