我试图在Safari中使用新的推送通知。我正在使用以下代码段:
var checkRemotePermission = function (permissionData) {
if (permissionData.permission === 'default') {
// This is a new web service URL and its validity is unknown.
console.log("default");
window.safari.pushNotification.requestPermission('https://website.com/','web.com.website.notify',{uid: "TEST"},checkRemotePermission);
}
else if (permissionData.permission === 'denied') {
// The user said no.
console.log("no");
}
else if (permissionData.permission === 'granted') {
// The web service URL is a valid push provider, and the user said yes.
// permissionData.deviceToken is now available to use.
console.log("yes");
}
};
if ('safari' in window && 'pushNotification' in window.safari) {
var permissionData = window.safari.pushNotification.permission('web.com.website.notify');
checkRemotePermission(permissionData);
}else{
alert("This feature is only available on Mac OS X safari")
}
问题是我在我的javascript控制台中获得了no
,因为permission
是denied
。事情是它从未被问过,也从未被问过。它甚至不在我的旅行者偏好中。
为什么safari会在没有询问的情况下返回denied
?
答案 0 :(得分:3)
使用“自签名”SSL证书在您的计算机上“本地”测试时,似乎会发生此行为。
我尝试在我的计算机上本地使用Rails 4应用程序中的Safari推送通知时,看到了完全相同的行为。我正在使用nginx和在命令行上生成的自签名SSL证书。
我使用的JavaScript代码与你的代码非常相似,我经常看到我的调试console.log
语句中的“拒绝”输出,但是没有向用户显示请求他们允许发送它们的提示通知。
经过一次这样的尝试,我检查了我的机器上的 Console.app 。就在那时,我发现了这个有点神秘,但看似相关/有用的信息块:
SafariNotificationAgent[65893]: NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9812)
这一点,加上一些来自官方Apple开发者论坛的类似猜测的回复,让我相信自签名SSL证书是这种情况下的罪魁祸首。
我希望听到其他人的想法,以更好的方式在本地测试Safari推送通知。
答案 1 :(得分:3)
在本地测试时可能会发生此错误,因为您要测试的地址不是网站allowedDomains
中pushPackage
数组的一部分。对于https://zeropush.com,我们将主机lvh.me
添加到pushPackage
并在端口80
上运行服务器,同时我们正在实施safari推送通知。然后,您可以在lvh.me
访问您的开发站点,并且事情应该正常运行。
您还应该在safari推送通知文档中描述您的站点的日志记录终结点,以便您可以获取任何错误日志信息以帮助您进行调试。
我还写了一篇关于实现有点以红宝石为中心的safari推送通知的帖子,但可能会有用。 https://zeropush.com/blog/implementing-safari-push-notifications-in-osx-mavericks
答案 2 :(得分:1)
最初,权限设置为默认值,因此,safari会进行一次调用以将pushPackage下载到您的webserviceURL。即使您的pushPackage以任何方式无效,Safari也会拒绝拒绝。请参阅此处给出的流程图以及错误日志
如前所述,您还需要有效的SSL证书(非自签名)。最佳实践是实现/ version / log来诊断错误。
答案 3 :(得分:0)
我在本地测试通知时遇到了同样的问题!
但我找到了一个解决方案:如果您将文件复制到主文件夹中的Sites文件夹并通过包含的apache访问它(例如:http://localhost/~username/notification.html
),它将询问您的权限并按预期工作:)
答案 4 :(得分:0)
我的案例帮助了来自 https://stackoverflow.com/users/474779/jake-marsh 的提示。
尝试在 mac 上启动 Console 应用程序(最好使用 Spotlight 找到它)并检查 Safari 生成的错误: