现在我正在使用来自该库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']
    }
)

最佳答案

您可以使用curl功能从管理员端发送推送通知。我最近使用Java脚本和PHP推送了通知。您可以像在轨道上发送红宝石一样发送。请参考firebase.google.com.

使用Firebase需要三个文件来发送推送通知。第一个html / php / ruby​​文件,用于允许用户接受许可。第二个Service worker文件在根文件夹中上载。第三服务器文件需要发送有关单个令牌或组令牌的推送通知。当用户允许通知时,您将获得令牌。您可以将令牌保存在数据库中并发送推送通知。

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


试试这个。.可能对您有一点帮助

10-01 08:55
查看更多