2016-11-02 7 views
7

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

Спасибо!

ответ

6

Update

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

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

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

Вы можете назвать REST API, чтобы сделать это, в частности create a relation mapping for an app instance:

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 ключ для вашего приложения.

+0

Спасибо, Фрэнк! Это похоже на переулок, в котором мне нужно спуститься. Есть ли что-то, что мне нужно для настройки с моим проектом Firebase, чтобы использовать API IID? Нужно ли мне заранее задавать тему где-то? Я попытался использовать эту функцию, но я получаю ошибку 401 в консоли: «Ошибка при подписке на тему: 401 - [Object Promise]». Для справки я проверил, что токен верен (я могу отправить целевое уведомление конкретному токену), и мой apiKey также настроен правильно. – Derek

+0

О, и для дальнейшего контекста я просто изучаю Firebase. Я получил проект быстрого запуска JS-сообщений Firebase и успешно работал, поэтому, если он помогает узнать, как выглядит база кода, это то, что я использую: https://github.com/firebase/quickstart-js/дерево/мастер/сообщений. – Derek

+0

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

2

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

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 весна)

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

Хотелось бы надеяться, что имеет смысл.

+0

Это потрясающее решение .. Большое спасибо .. вы спасли мой день .. (может быть, даже неделя, я собирался сделать обычную реализацию с помощью websocket!) –

0

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

стороны клиента огненного Баз коды расслоения плотной

// 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 локона

$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

Смежные вопросы