Как подписаться на темы с помощью веб-браузера с помощью Firebase Cloud Messaging

Я пытаюсь найти способ отправить уведомление с помощью Firebase Cloud Messaging всем пользователям моего приложения, но у меня есть только веб-приложение. Я видел решения, которые кажутся для Android / iOS, что в основном включает в себя автоматическую подписку пользователей на тему под названием "allDevices", а затем отправку уведомления всем пользователям, подписавшимся на эту тему. Я просто не могу найти никакой документации о том, как подписаться на веб-пользователя на тему. Кто-нибудь знает, возможно ли это, и если это так, есть ли документация, которую я пропустил, которая покроет это?

спасибо!

3 ответов


обновление

для подписки токена на тему через REST API требуется пользователь ключа сервера. Поскольку ключ сервера позволяет отправлять сообщения от имени приложения всем пользователям приложения, это можно безопасно сделать только из процесса, который вы контролируете.

оказывается, в моих тестах я использовал более старый проект, где ключи API клиента были позволяет подписаться на темы. Эта возможность была удалена из новых проектов для соображения безопасности.

оригинальный ответ ниже:

вы можете вызвать REST API для этого, в частности создайте сопоставление отношений для экземпляра приложения:

function subscribeTokenToTopic(token, topic) {
  fetch('https://iid.googleapis.com/iid/v1/'+token+'/rel/topics/'+topic, {
    method: 'POST',
    headers: new Headers({
      'Authorization': 'key='+config.apiKey
    })
  }).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);
  })
}

здесь config - Это фрагмент конфигурации для вашего веб-приложения Firebase, поэтому config.apiKey - это общественные ключ api для вашего приложения.


решение франков по-прежнему действует. Однако вам нужно иметь сервер, который делает подписку для вас.

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);
  })
}

тогда ваш сервер имеет вызов rest что-то вроде этого:

(Ява пружина)

@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.. 
  ...
}

надеюсь, это имеет смысл.


любой, кто ищет решение php, найдите ниже поскольку вы собираетесь использовать Api-ключ сервера, не делайте этого на стороне клиента

клиентская огневая база JS code

// 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