Я использую webpush и столкнулся с проблемой. Я могу заставить его работать отлично с сервером и базой данных на хроме. Но когда я пытаюсь зарегистрироваться/подписаться в своем браузере 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
Здесь мой код для регистрации SW на 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
}
},
с помощью:
window.safari.pushNotification
вместо
window.PushManager
должен работать (не тестировать), но только после регистрации с яблоком.
как описано здесь
"Для отправки push-уведомлений необходимо зарегистрироваться в разделе" Сертификаты, идентификаторы и профили "своей учетной записи разработчика".
похоже, что Safari все еще работает за пределами текущего стандарта и требует регистрации для их обслуживания
если вы хотите просто отфильтровать ошибку и не хотите использовать push-уведомления в 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
}
в противном случае: следуйте описанию яблок, указанному выше, или проверьте возможности опроса (не уверен, что это работает) и локальных уведомлений
информация найдена через:
посещение https://whatwebcando.today/push-notifications.html с рабочим столом Safari показало мне путь к решению, указанному выше