gpt4 book ai didi

javascript - 使用 Service Worker 推送通知而不订阅

转载 作者:行者123 更新时间:2023-12-03 03:11:32 28 4
gpt4 key购买 nike

现在我正在使用这个库的推送通知 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!'
});
});
});
});
}

从这些代码中,如果我们已经订阅了推送通知,它就会起作用,但我想要做的是,访问者向所有订阅者触发推送通知(只有从我的仪表板订阅推送通知的 super 管理员)。有什么解决方案可以将所有订阅推送给所有从我的网站订阅的管理员吗?

这是触发推送通知时我的后端代码

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']
}
)

最佳答案

您可以使用curl功能从管理端发送推送通知。我最近使用java脚本和PHP做了推送通知。您可以像 ruby​​ on Rails 一样发送。请引用firebase.google.com.你会得到更好的主意。

需要使用 firebase 三个文件来发送推送通知。第一个 html/php/ruby 文件允许用户接受权限。第二个 Service Worker 文件上传到根文件夹中。第三个服务器文件需要发送单个 token 或组 token 的推送通知。当用户允许通知时,您将获得一个 token 。您可以将 token 保存在数据库中并发送推送通知。

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>

firebase-messaging-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>----';
}

试试这个..希望这会对你有一点帮助

关于javascript - 使用 Service Worker 推送通知而不订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46930467/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com