我正在尝试使用Firebase Cloud Messaging向我的所有应用用户发送通知,但我有一个仅限网络的应用。我见过似乎适用于Android / iOS的解决方案,主要涉及让用户自动订阅名为“allDevices”的主题,然后向订阅该主题的所有用户发送通知。我似乎无法找到有关如何让基于Web的用户订阅主题的任何文档。有谁知道这是否可能,如果是的话,是否有我错过的文件会覆盖那些?
谢谢!
答案 0 :(得分:11)
通过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密钥。
答案 1 :(得分:5)
Franks解决方案仍然有效。但是,您需要有一个为您订阅的服务器。
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..
...
}
希望这是有道理的。
答案 2 :(得分:3)
任何寻找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开发人员有所帮助
答案 3 :(得分:0)
使用服务器密钥代替config.apiKey可以正常工作。
答案 4 :(得分:0)
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;
}