web-dev-qa-db-ja.com

Firebase Cloud Messagingを使用してウェブブラウザでトピックをサブスクライブする方法

アプリのすべてのユーザーにFirebase Cloud Messagingを使用して通知を送信する方法を見つけようとしていますが、私はウェブ専用アプリを持っています。私はAndroid/iOS向けのソリューションを見てきました。これには、基本的に「allDevices」というトピックにユーザーを自動サブスクライブさせ、そのトピックにサブスクライブしているすべてのユーザーに通知を送信することが含まれます。 Webベースのユーザーにトピックをサブスクライブさせる方法に関するドキュメントが見つからないようです。それが可能かどうか誰かが知っていますか?それが可能であれば、それをカバーするために私が見逃したドキュメントはありますか?

ありがとう!

16
Derek

更新

REST APIを介してトピックにトークンをサブスクライブするには、サーバーキーのユーザーが必要です。サーバーキーがあると、アプリのすべてのユーザーにアプリの代わりにメッセージを送信できるため、これはあなたが制御するプロセスから安全に行われます。

私のテストでは、クライアントAPIキー were でトピックをサブスクライブできる古いプロジェクトを使用していたことがわかりました。この機能は、セキュリティ上の理由から新しいプロジェクトから削除されました。

以下の元の回答

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は、アプリのpublic APIキーです。

16

フランクスの解はまだ有効です。ただし、サブスクライブを行うサーバーが必要です。

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

うまくいけば、それは理にかなっています。

6
user7582859

サーバーのAPIキーを使用するため、phpソリューションを探している人は以下を見つけてください。クライアント側ではこれを行わないでください。

クライアント側のFireベース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開発者に役立つことを願っています

4
Ishak Ali

Config.apiKeyの代わりにサーバーキーを使用すると、正常に機能します。

0
selva