无需订阅即可与Service Worker进行推送通知

时间:2017-10-25 10:51:04

标签: javascript ruby-on-rails ruby service-worker

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

2 个答案:

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