不允许 Safari 推送通知

Posted

技术标签:

【中文标题】不允许 Safari 推送通知【英文标题】:Safari Push Notifications can't be allowed 【发布时间】:2017-11-20 08:52:36 【问题描述】:

我正在尝试使用本指南https://developer.apple.com/library/archive/documentation/NetworkingInternet/Conceptual/NotificationProgrammingGuideForWebsites/PushNotifications/PushNotifications.html在我的网站上实现 Safari 推送通知

网站上有一个按钮和下面的JS代码:

window.onload = function()                                                                                                
  var p = document.getElementById('subscribe');                                                                            
  p.onclick = function()                                                                                                  
    // Ensure that the user can receive Safari Push Notifications.                                                         
    if ('safari' in window && 'pushNotification' in window.safari)                                                        
      var permissionData = window.safari.pushNotification.permission('MY_REAL_WEBSITE_PUSH_ID');       
      checkRemotePermission(permissionData);                                                                               
                                                                                                                          
  ;                                                                                                                       

  var checkRemotePermission = function(permissionData)                                                                    
    console.log(permissionData);                                                                                           
    if (permissionData.permission === 'default')                                                                          
      // This is a new web service URL and its validity is unknown.                                                        
      window.safari.pushNotification.requestPermission(                                                                    
        'MY_REAL_WEBSERVICE_URL', // The web service URL.                                             
        'MY_REAL_WEBSITE_PUSH_ID',     // The Website Push ID.                                         
        , // Data that you choose to send to your server to help you identify the user.                                  
        checkRemotePermission         // The callback function.                                                            
      );                                                                                                                   
                                                                                                                          
    else if (permissionData.permission === 'denied')                                                                      
      // The user said 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(permissionData); 显示 permissionData.permission 等于拒绝,我可以在 Safari 的首选项 -> 通知部分看到网站被拒绝。

但是当我允许通知时,什么都没有发生。似乎checkRemotePermission 不会像window.safari.pushNotification.requestPermission 的回调一样触发。

有什么想法吗?

【问题讨论】:

您的代码似乎与文档中的代码完全相同。那应该行得通。什么是console.log(permissionData); 日志记录? 我希望看到permissionData.permission 将等于granted,但checkRemotePermission 不会在通知允许后调用,而是在通知禁止后调用,我看到permissionData.permission 等于denied 有什么进展吗?我有同样的问题,但我想可能是因为我在虚拟机上测试? 看看这些对***.com/a/20552061/2830850,***.com/a/25680982/2830850有没有帮助? 似乎Apple不允许用户改变主意:(见答案1)***.com/questions/24596837/… 【参考方案1】:

我在虚拟机中遇到了类似的问题,并为 VMWare 找到了解决方案。

在配置.vmx文件中,你需要添加如下内容:

smbios.reflectHost = "TRUE"
serialNumber = "RM125589AGW"
board-id = "MAC-F22598C8"

【讨论】:

听起来不错,但我在 macbook 上运行脚本,所以它不适合我 是的,它是可能的,但是当我理解我的问题并且这个答案可以帮助其他人时,我发现了这个问题。【参考方案2】:

只有在成功验证推送包的情况下才会授予权限。如果出现问题,则将权限设置为拒绝。您需要检查服务器上的/log 端点以了解问题所在。

【讨论】:

以上是关于不允许 Safari 推送通知的主要内容,如果未能解决你的问题,请参考以下文章

移动 Safari 推送通知

网站的 OSX 推送通知 - 从未调用过 Safari requestPermission 回调

Safari 推送通知不起作用

带有 FCM 推送通知的 Safari [重复]

Chrome 中的 OS X Mavericks 推送通知

如果用户既没有允许也没有“不允许”我的应用程序的推送通知,推送通知会起作用吗?