Google chrome PushPad:在站点刷新后删除订阅

Google chrome PushPad:在站点刷新后删除订阅,google-chrome,push-notification,web-push,push-api,pushpad,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('sc

我集成了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>

(函数(p,u,s,h,x){p.pushpad=p.pushpad | | function(){(p.pushpad.q=p.pushpad.q | |[]).push(参数)};h=u.getElementsByTagName('head')[0];x=u.createElement('script');x.async=1;x.src=s;h.appendChild(x);)(窗口,文档,'https://pushpad.xyz/pushpad.js');
//安装推板
pushpad('init',myprojectnumber);
警报(“已初始化的Pushpad”);
//检查订阅状态
按钮板(“状态”、功能(已订阅、标签){
//用户已订阅
如果(已订阅){
警报(“已订阅”);
//用户尚未订阅
}否则{
警报(“未订阅”);
//如果此登录用户已经订阅了5个不同的设备,请签入数据库,如果没有,则生成UID和UID\U签名
var username=$('#username_show').html();
警报(“用户名:”+用户名);
$.ajax
({                                        
类型:“POST”,
数据:{username:username},
数据类型:“json”,
url:“setNotifications.php”,
cache:false,
成功:功能(数据)
{
警报(“Ajax successfull.UID生成”);
如果(data.uid!=0){
//设置UID和UID-SIGNATURE
pushpad('uid',data.uid,data.uid\u签名);
警报('UID:'+data.UID);
//订阅
按钮板(“订阅”,功能(已订阅){
如果(已订阅){
警报(“订阅”);
}否则{
警报(“阻止通知”);
}
});
//已经订阅了5台设备
}否则{
警报(“已有5台设备”);
}
},
错误:函数()
{
警报(“错误”);
}
});
}
});
乍一看一切正常。如果我第一次访问该站点,所有警报都会弹出,直到出现“UID”-警报。然后Chrome要求我接受推送通知。我单击“允许”,然后弹出警报“已订阅”

如果我现在刷新站点,一切都会重复到“订阅”警报(但我不再被要求允许Chrome推送通知)。我本以为应该显示“已订阅”警报,因为我以前订阅过,但它没有


如果有人能帮忙,我们将不胜感激:-)

问题是
状态
返回当前用户(uid)的订阅状态。您只为subscribe设置了uid,而status对此一无所知

这就是代码中发生的情况:

  • 用户实际上已订阅推送通知
  • 你可以刷新页面
  • status
    检查是否存在uid=
    null
    的订阅(不适用于实际用户id,因为尚未设置!)
  • 它返回false,因为没有uid=
    null的订阅
  • 再次触发订阅过程
  • 解决方案是将所有Pushpad代码移动到AJAX成功回调中。因此,您可以按照以下顺序进行操作:

  • pushpad('init')
  • 您的ajax回调
  • 成功后,使用pushpad('uid')设置uid
  • pushpad('状态')
  • 在pushpad('status')回调中使用pushpad('subscribe'))

  • 顺便问一下,为什么要使用AJAX回调来获取uid?如果用户在呈现包含Pushpad代码的页面时登录到您的网站,则您可能已经知道uid(例如用户电子邮件或数据库中用户的id)。您可以执行类似于
    pushpad('uid','')

    此外,在我的PushPad项目中,浏览器似乎已订阅了我提供的UID,但我无法向其发送任何推送。关于您的评论:请尝试从仪表板中选择1。给evryone发送一个通知,看看你是否收到了什么。发送通知,填写仪表板中的用户id筛选器(如果该uid已保存在数据库中,则当您开始在输入字段中键入它时,您应该会看到一个建议/自动完成)感谢您的帮助:-)我的代码中有一个错误的工作流,但您的建议有帮助。但现在我有另一个问题。我已经用我的用户名作为UID进行了订阅,可以在我的pushpad项目中看到订阅,在我的网站上,它还显示“已订阅”作为状态。但我无法接收任何发送的通知。当我发送任何通知时(不管是发送给所有用户还是仅发送给我的uid),它会显示
    0成功发送->0打开
    ?上面的评论与Google Chrome有关。现在我也在Firefox上登录了我的网站账号,并设置了与Google Chrome相同的UID。再次向UID发送推送,它与Firefox兼容,但与Chrome不兼容。我发现了另一件奇怪的事情。当我进入Resources下的Chrome Developer Tools以服务工作人员时,有一个标记为“模拟推送事件”的按钮。单击此按钮后,我发送给UID的所有“测试推送”立即显示,就好像它们一直在等待队列中,而不是由服务人员交付?@FabianH。是的,这是预期的行为。触发推送事件时,服务工作者从服务器(Pushpad)获取该设备的所有新通知并显示通知。是,但不会自动显示通知。使用Firefox,我会在发送通知时准确地接收通知(并在那一刻显示)。但是色度