PushPad:在网站刷新后删除订阅

时间:2016-05-24 23:04:01

标签: google-chrome push-notification web-push push-api pushpad

我已经集成了PushPad,并设法使其适用于静态Push。现在我想将它与一些PHP和Javascript函数结合起来使它变得动态。 这是我的代码:

<script>
    (function(p,u,s,h,x){p.pushpad=p.pushpad||function(){(p.pushpad.q=p.pushpad.q||[]).push(arguments)};h=u.getElementsByTagName('head')[0];x=u.createElement('script');x.async=1;x.src=s;h.appendChild(x);})(window,document,'https://pushpad.xyz/pushpad.js');

    //Install Pushpad
    pushpad('init', myprojectnumber);
    alert("Pushpad initialised");
    //Check subscribe-status
    pushpad('status', function (isSubscribed, tags){
        //User is already subscribed
        if (isSubscribed){
            alert("Already subscribed");
        //User has not subscribed
        }else{
            alert("Not subscribed");
            //Check in database if this logged-in-user has already subscribed with 5 different devices, if not generate UID and UID_SIGNATURE
            var username = $('#username_show').html();

            alert('Username: ' + username);
            $.ajax
            ({                                        
                type: "POST",
                data: {username: username},
                dataType: "json",
                url: "setNotifications.php",
                cache: false,
                success: function(data)
                {
                    alert("Ajax successfull. UID generated.");

                    if (data.uid != 0){
                        //Set UID and UID-SIGNATURE
                        pushpad('uid', data.uid, data.uid_signature);
                        alert('UID:' + data.uid);
                        //Subscribe
                        pushpad('subscribe', function(isSubscribed){
                            if (isSubscribed){
                                alert("Subscribed");
                            }else{
                                alert("Notifications blocked");
                            }

                        });
                    //Already 5 devices subscribed
                    }else{
                        alert("Already 5 devices");
                    }
                },
                error: function()
                {
                    alert('Error');
                }
            });
        }
    });
</script>
乍一看,一切正常。如果我第一次访问该网站,则会弹出所有警报,直至&#34; UID&#34; -alert。然后Chrome要求我接受推送通知。我点击允许然后点击提示&#34;已订阅&#34;弹出。

如果我现在刷新网站,一切都会重复到&#34;已订阅的&#34; -alert(但我不会要求Chrome允许推送通知)。我本以为警报已经订阅了#34;应该出现,因为我之前订阅过,但它没有。

如果有人可以提供帮助,我将不胜感激: - )

1 个答案:

答案 0 :(得分:1)

问题是status会返回当前用户(uid)的订阅状态 。您只为订阅设置了uid,状态并不知道。

这是您的代码中发生的事情:

  1. 用户实际上订阅了推送通知
  2. 您刷新页面
  3. status检查是否订阅了uid = null(不是因为实际的用户ID,因为尚未设置!)
  4. 它返回false,因为没有使用uid = null
  5. 的订阅
  6. 再次触发订阅过程
  7. 解决方案是将所有Pushpad代码移动到AJAX成功回调中。所以你按照以下顺序:

    1. pushpad(&#39;初始化&#39)
    2. 你的ajax回调
    3. 成功后你用pushpad设置了uid(&#39; uid&#39;)
    4. pushpad(&#39; status&#39;)
    5. 在按键内(&#39;状态&#39;)回调使用按键(&#39;订阅&#39;)
    6. BTW为什么你使用AJAX回调来获取uid?如果用户在呈现包含Pushpad代码的页面时登录到您的网站,您可能已经知道了uid(例如用户电子邮件或数据库中用户的ID)。您可以执行pushpad('uid', '<?= $uid ?>', '<?= $uid_signature ?>');

      之类的操作