我目前在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上。
答案 0 :(得分:0)
我唯一缺少的是在gcm_sender_id
中定义的manifest.json
- Chrome(至少对于Android)似乎要求,即使它是不是的一部分推送API规范。