没有询问,Safari推送通知返回被拒绝

时间:2013-11-17 21:32:32

标签: javascript safari push-notification apple-push-notifications

我试图在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,因为permissiondenied。事情是它从未被问过,也从未被问过。它甚至不在我的旅行者偏好中。

为什么safari会在没有询问的情况下返回denied

5 个答案:

答案 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)

在本地测试时可能会发生此错误,因为您要测试的地址不是网站allowedDomainspushPackage数组的一部分。对于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也会拒绝拒绝。请参阅此处给出的流程图以及错误日志

https://developer.apple.com/library/mac/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/PushNotifications/PushNotifications.html

如前所述,您还需要有效的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 生成的错误:

enter image description here