【问题标题】:Safari push notifications return denied without askingSafari 推送通知返回被拒绝而不询问
【发布时间】:2013-11-30 22:24:42
【问题描述】:

我正在尝试在 Safari 中使用新的推送通知。我正在使用以下 sn-p:

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 偏好中。

为什么 safari 不问就返回 denied

【问题讨论】:

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


    【解决方案1】:

    在本地测试时可能会发生此错误,因为您正在测试的地址不是站点pushPackageallowedDomains 数组的一部分。对于https://zeropush.com,我们将主机lvh.me 添加到pushPackage 并在端口80 上运行服务器,同时我们正在实施Safari 推送通知。然后,您可以通过 lvh.me 访问您的开发站点,一切正常。

    您还应该为您的网站实现 safari 推送通知文档中描述的日志记录端点,以便您可以获取任何错误日志信息以帮助您进行调试。

    我还写了一篇关于实现 safari 推送通知的帖子,它有点以 ruby​​ 为中心,但可能有用。 https://zeropush.com/blog/implementing-safari-push-notifications-in-osx-mavericks.

    【讨论】:

      【解决方案2】:

      似乎在使用“自签名”SSL 证书在您的机器上进行“本地”测试时会发生这种情况。

      我在尝试让 Safari 推送通知在我的机器上本地的 Rails 4 应用程序中工作时看到了完全相同的行为。我正在使用带有在命令行上生成的自签名 SSL 证书的 nginx。

      我使用的 JavaScript 代码与您的代码非常相似,并且我经常从我的调试 console.log 语句中看到“拒绝”输出,但从未向用户显示任何提示,请求他们允许向他们发送推送通知。

      在一次这样的尝试之后,我在我的机器上检查了 Console.app。就在那时,我发现了这个神秘但看似相关/有用的信息块:

      SafariNotificationAgent[65893]: NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9812)

      这一点,再加上苹果官方开发者论坛的一些类似猜测的回应,让我相信自签名 SSL 证书是本案的罪魁祸首。

      我很想听听其他人关于在本地测试 Safari 推送通知的更好方法的想法。

      【讨论】:

      • 如果您首先强制 Safari 信任证书,则可以使用自签名证书。
      • @E-Madd 你如何强制 Safari 信任证书?
      • 你拯救了我的一天!
      【解决方案3】:

      我在本地测试通知时遇到了同样的问题! 但我找到了一个解决方案:如果您将文件复制到主文件夹中的站点文件夹并通过包含的 apache(例如:http://localhost/~username/notification.html)访问它,它会询问您的权限并按预期工作:)

      【讨论】:

        【解决方案4】:

        最初,权限设置为默认,因此,safari 会发出 post 调用以将 pushPackage 下载到您的 webserviceURL。即使您的 pushPackage 以任何方式无效,Safari 也会返回拒绝。请参阅此处给出的流程图以及错误日志

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

        如前所述,您还需要有效的 SSL 证书(非自签名)。最佳实践是实施 /version/log 来诊断错误。

        【讨论】:

          【解决方案5】:

          我的案例帮助了来自https://stackoverflow.com/users/474779/jake-marsh 的提示。

          尝试在 mac 上启动控制台应用程序(最好使用 Spotlight 找到它)并检查 Safari 生成的错误:

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-09-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-10-11
            • 1970-01-01
            • 2010-11-29
            • 1970-01-01
            相关资源
            最近更新 更多