Chrome和Service Worker推送API

时间:2016-11-19 00:11:53

标签: javascript google-chrome

我目前在FireFox中工作但在Chrome中不起作用。当我在Android上尝试使用Chrome时,目前无法访问桌面上的Chrome(CentOS 7,他们不支持),因此调试问题很难。

这是我用来检查是否支持推送通知的内容:

function checkPushSupport() {
    "use strict";
    if (!("serviceWorker" in navigator)) {
        return false;
    }
    if (!("showNotification" in ServiceWorkerRegistration.prototype)) {
        return false;
    }
    if (Notification.permission === "denied") {
        return false;
    }
    if (!("PushManager" in window)) {
        return false;
    }
    return true;
}

通过该测试,Android Chrome支持它。

这是我测试浏览器是否已订阅的方式。它目前正在执行ajax调用,在某些时候会更改为使用IndexDB,但我仍然需要一次找出IndexDB。

function checkSubscribe(endpoint) {
    "use strict";
    var csrf;
    var mid;
    var n;
    var postdata;
    var endhash;
    csrf = $("#container").attr("data-csrf");
    mid = $("#pushnotify").attr("data-mid");
    postdata = {csrf: csrf, mid: mid, endpoint: endpoint};
    $.ajax({
        type: "POST",
        async: false,
        url: "/ajax/checksubscribe.ajax.php",
        data: postdata,
        dataType: "json",
        success: function (json) {
            $("#container").attr("data-csrf", json.csrf);
            endhash = json.endhash;
            if (endhash.length === 40) {
                $("#notify").attr("data-hash", endhash);
            }
            n = parseInt(json.result);
            if (n > 0) {
                swapButton();
            }
            $("#notify").removeAttr("disabled");
            // attach action to button
            $("#notify").bind("click", function () {
                sendSubscribe();
            });
        }
    });
}

该功能在FireFox中可以正常工作。当它检测到客户端已经订阅了从网站推送时,它使按钮能够在网站内订阅(用户想要通知的内容),并在按钮上创建数据哈希属性,并使用其端点的哈希值,即哈希值当他们想要订阅或取消订阅功能时,它与ajax一起使用。如果他们已经订阅了页面上的功能,则会将订阅按钮更改为ubsubsribe按钮。我不认为该功能在Chrome中失败,但由于订阅推送通知似乎不起作用,我不知道它是否正确检测到推送订阅。

我认为这就是问题所在,它是用户实际推送订阅网站的方式:

function addEndpoint(endpoint) {
    "use strict";
    var csrf;
    var postdata;
    var endhash;
    csrf = $("#container").attr("data-csrf");
    postdata = {csrf: csrf, endpoint: endpoint};
    $.ajax({
        type: "POST",
        async: false,
        url: "/ajax/notification.ajax.php",
        data: postdata,
        dataType: "json",
        success: function (json) {
            $("#container").attr("data-csrf", json.csrf);
            endhash = json.endhash;
            if (endhash.length === 40) {
                $("#notify").attr("data-hash", endhash);
            }
        }
    });
}

function firstSubscription() {
    "use strict";
    navigator.serviceWorker.ready.then(function (registration) {
        return registration.pushManager.subscribe({userVisibleOnly: true});
    }).then(function (subscription) {
        $("#notify").off("click");
        addEndpoint(subscription.endpoint);
        sendSubscribe();
        $("#notify").bind("click", function () {
            sendSubscribe();
        });
    });
}

Chrome for Android从不询问用户是否要订阅,并且当他们想要订阅时,发送给我的端点的ajax调用永远不会发生。当然,如果未创建端点,如果永远不会询问用户,则不会发生这种情况,我试图弄清楚为什么它在FireFox中工作得很好而在Chrome中不能正常工作。

一切都是HTTPS。

感谢任何帮助,我尝试查看Google的文档,但他们的所有教程似乎都假设Google的开发人员工具正在使用,而且,我根本无法使用它们在CentOS上。

1 个答案:

答案 0 :(得分:0)

我唯一缺少的是在gcm_sender_id中定义的manifest.json - Chrome(至少对于Android)似乎要求,即使它是不是的一部分推送API规范。