Javascript Safari推送通知pushmanager无法注册

Javascript Safari推送通知pushmanager无法注册,javascript,api,safari,web-push,Javascript,Api,Safari,Web Push,我在使用webpush时遇到了一个问题。我可以使它与chrome上的服务器和数据库配合使用。但当我尝试从safari浏览器注册/订阅时,会出现以下错误: TypeError: undefined is not an object (evaluating 'n.pushManager.subscribe') (anonym funktion) — Header.vue:99 r — runtime.js:62 (anonym funktion) — runtime.js:296

我在使用webpush时遇到了一个问题。我可以使它与chrome上的服务器和数据库配合使用。但当我尝试从safari浏览器注册/订阅时,会出现以下错误:

TypeError: undefined is not an object (evaluating 'n.pushManager.subscribe')
   (anonym funktion) — Header.vue:99
   r — runtime.js:62
   (anonym funktion) — runtime.js:296
   r — asyncToGenerator.js:17
   (anonym funktion) — asyncToGenerator.js:28
   promiseReactionJob
这是我在Chrome上注册软件的代码

notification () {
      var storeId = this.$session.get('user').accessId
      const publicVapidKey = 'PublicVAPID'
      if ('serviceWorker' in navigator) {
        send().catch(err => console.error(err))
      }
      async function send () {
        var register = await navigator.serviceWorker.register('/service-worker.js', {
          scope: '/'
        })
        const subscription = await register.pushManager.subscribe({
          userVisibleOnly: true,
          applicationServerKey: urlBase64ToUint8Array(publicVapidKey)
        })
        await axios({
          method: 'post',
          url: 'API',
          data: {
            subscription: JSON.stringify(subscription),
            storeId: storeId
          },
          headers: {
            'Content-Type': 'application/json'
          }
        }).then(response => {
          console.log(response)
        })
        alert('you are now getting notifications')
      }
      function urlBase64ToUint8Array (base64String) {
        console.log(base64String)
        const padding = '='.repeat((4 - base64String.length % 4) % 4)
        const base64 = (base64String + padding).replace(/-/g, '+').replace(/_/g, '/')
        const rawData = window.atob(base64)
        const outputArray = new Uint8Array(rawData.length)

        for (let i = 0; i < rawData.length; ++i) {
          outputArray[i] = rawData.charCodeAt(i)
        }
        return outputArray
      }
    },
通知(){
var storeId=this.$session.get('user').accessId
const publicVapidKey='PublicVAPID'
if(导航器中的“serviceWorker”){
send().catch(err=>console.error(err))
}
异步函数send(){
var register=Wait navigator.serviceWorker.register('/service worker.js',{
范围:'/'
})
const subscription=wait register.pushManager.subscripte({
userVisibleOnly:true,
applicationServerKey:urlBase64ToUint8Array(publicVapidKey)
})
等待axios({
方法:“post”,
url:'API',
数据:{
订阅:JSON.stringify(订阅),
storeId:storeId
},
标题:{
“内容类型”:“应用程序/json”
}
})。然后(响应=>{
console.log(响应)
})
警报('您现在收到通知')
}
函数urlBase64ToUint8Array(base64String){
console.log(base64String)
常量填充='='。重复((4-base64String.length%4)%4)
常量base64=(base64String+padding).replace(/-/g,'+').replace(/\ug/g,'/'))
const rawData=window.atob(base64)
const outputArray=新的Uint8Array(rawData.length)
for(设i=0;i
使用:

window.safari.pushNotification
而不是

window.PushManager
应该有效(没有测试),但只有在向苹果注册之后

作为

“您需要在证书、标识符和& 要发送推送的开发人员帐户的配置文件部分 通知。”

看起来Safari仍在当前标准之外运行,需要注册其服务


如果您只想过滤掉错误,并且对safari上没有推送通知感到满意,您可以执行以下操作:

if (registration.pushManager)
  {
   //... do your pushManager.subscribe magic
  }
else
{
  console.log("pushManager not available via web standard")
  // either use apples own push service, do nothing or try local notifications
}
否则:按照上面链接的苹果描述或检查轮询的可能性(不确定是否有效)和


可通过以下途径找到信息:

访问safari桌面向我展示了上述解决方案的方法