现在我正在使用此库https://github.com/rossta/serviceworker-rails
的推送通知我已按照说明操作,并且已成功实施,(我收到了推送通知)。 但是现在,我想知道用户是否可以在没有订阅的情况下推送通知?因为我希望我的推送通知是在人们在我的注册表单上注册后发送的,只有管理员可以订阅&从新用户注册中获取推送通知。
当新用户第一次访问并注册时,这是我的脚本
if(navigator.serviceWorker) {
console.log('Begin to push notif');
navigator.serviceWorker.register('/serviceworker.js')
.then(function(reg) {
console.log('Register service worker');
navigator.serviceWorker.ready
.then(function(serviceWorkerRegistration) {
serviceWorkerRegistration.pushManager.getSubscription()
.then(function(subscription) {
$.post('/push', {
subscription: subscription.toJSON(),
message: 'There is a new registered User!'
});
});
});
});
}
从这些代码中,只要我们已经有订阅推送通知就可以工作,但我想要做的是,访问者触发所有订阅者的推送通知(只有从我的仪表板订阅推送通知的超级管理员)。任何解决方案,以获取所有订阅推送给所有从我的网站订阅的管理员?
这是触发推送通知时的后端代码
result = Webpush.payload_send(
message: params[:message],
endpoint: params[:subscription][:endpoint],
p256dh: params[:subscription][:keys][:p256dh],
auth: params[:subscription][:keys][:auth],
ttl: 24 * 60 * 60,
vapid: {
subject: 'mailto:calvin@thechordgenius.com',
public_key: ENV['VAPID_PUBLIC_KEY'],
private_key: ENV['VAPID_PRIVATE_KEY']
}
)
答案 0 :(得分:1)
您可以使用curl
功能从管理员端发送推送通知。我最近使用java脚本和PHP推送通知。您可以在轨道上发送与ruby相同的内容。请参考firebase.google.com.您将会有更好的想法。
使用firebase需要三个文件来发送推送通知。第一个html / php / ruby文件,允许用户接受权限。根文件夹中的第二个服务工作者文件上载。第三个服务器文件需要发送单个令牌或组令牌的推送通知。当用户允许通知时,您将获得令牌。您可以将令牌保存在数据库中并发送推送通知。
HTML,
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script src="https://www.gstatic.com/firebasejs/4.3.0/firebase.js"></script>
<script>
// Initialize Firebase
var config = {
apiKey: "yours",
authDomain: "yours",
databaseURL: "yours",
projectId: "yours",
storageBucket: "yours",
messagingSenderId: "yours"
};
firebase.initializeApp(config);
const messaging = firebase.messaging();
messaging.requestPermission().then(function(){
console.log('Have permoission');
console.log(messaging.getToken());
return messaging.getToken();
}).then(function(token){
//you can insert token value to your database
$.post( "", { token: token, action: 'push-notification' }, function( data ) {
console.log(token);
})
})
.catch(function(err){
console.log('Error occured');
})
messaging.onMessage(function(payload){
console.log(payload);
});
</script>
火力的消息-sw.js
importScripts('https://www.gstatic.com/firebasejs/4.3.0/firebase-app.js');
importScripts('https://www.gstatic.com/firebasejs/4.3.0/firebase-messaging.js');
var config = {
apiKey: "yours",
authDomain: "yours",
databaseURL: "yours",
projectId: "yours",
storageBucket: "yours",
messagingSenderId: "yours"
};
firebase.initializeApp(config);
const messaging = firebase.messaging();
这里的服务器代码我正在使用php。你可以使用任何服务器语言
function send_notification($tokens)
{
$url = 'https://fcm.googleapis.com/fcm/send';
$fields = array(
'to' => $tokens,
'notification' => array('title' => 'Bumper Prize', 'body' => 'Shop for more than 10,000 get a chance to Bumper Prize', 'click_action' => 'https://www.gardensgalleria.com/', 'icon'=> 'https://www.gardensgalleria.com/notification_image/1507791852notification_logo.png'),
'priority' => 10
);
$headers = array(
'Authorization:key = yours',
'Content-Type: application/json'
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($fields));
$server_output = curl_exec($ch);
if ($server_output === FALSE) { die('Curl failed:' .curl_error($ch)); }
curl_close ($ch);
return $server_output;
}
$sql_select = mysql_query("SELECT token FROM notification_info");
$tokens = array();
while($row_retailer=mysql_fetch_assoc($sql_select))
{
echo send_notification($row_retailer['token']).'<br>----';
}
试试这个......愿这对你有所帮助
答案 1 :(得分:0)
我得到了解决方案!
使用此代码
订阅推送通知后,只需保存所有订阅哈希reg.pushManager
.subscribe({
userVisibleOnly: true,
applicationServerKey: window.vapidPublicKey
}).then(function(subscription) {
$.post( "/api/v1/subscribe", { 'subscription': subscription.toJSON() })
});
之后,将其保存在管理员的订阅字段中。每当访问者在网站上注册时,只需使用管理员的所有订阅字段推送它
Webpush.payload_send(
message: params[:message],
endpoint: admin.subscription[:endpoint],
p256dh: admin.subscription[:keys][:p256dh],
auth: admin.subscription[:keys][:auth],
ttl: 24 * 60 * 60,
vapid: {
subject: 'mailto:yourname@yourdomain.com',
public_key: ENV['VAPID_PUBLIC_KEY'],
private_key: ENV['VAPID_PRIVATE_KEY']
}
)