Я хочу отправить push-уведомление из библиотеки java, называемой Web-push-библиотекой для java. Это рабочий файл в Firefox, но когда дело доходит до Google Chrome, ему не удалось подписать push-менеджер следующим образом.
Не удалось выполнить «подписку» для «PushManager»: предоставленное значение не относится к типу «(ArrayBuffer или ArrayBufferView)»
Вот код и структура моей папки проекта.
До того, как я попробовал тот же код для Google Chrome, на этот раз он выполняется правильно. На этот раз он не авторизовал Mozilla Firefox. Это была ошибка на стороне сервера, которую я обнаружил.
</p>
<pre><code>async function subscribe() {
const response = await fetch('./VapidPublicKey');
const vapidPublicKey = await response.text();
console.log(vapidPublicKey);
const convertedVapidKey = urlB64ToUint8Array(vapidPublicKey);
var browserOptions={};
if(typeof InstallTrigger !== 'undefined'){
browserOptions={userVisibleOnly: true};
}else{
browserOptions={
userVisibleOnly: true,
applicationServerKey: convertedVapidKey
};
}
navigator.serviceWorker.ready.then(function
(serviceWorkerRegistration)
{
serviceWorkerRegistration.pushManager.
subscribe(browserOptions).then(function
(subscription) {
return sendSubscriptionToServer(subscription);
})
.catch(function (e) {
if (Notification.permission === 'denied') {
console.warn('Permission for Notifications was denied');
} else {
alert('Unable to subscribe to push.'+ e);
}
});
});
}
## А ниже приведен код для преобразования из base64url в uint8Array ## '
async function urlB64ToUint8Array(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);
}
console.log("output array is : "+outputArray);
return outputArray;
}
Структура папок
RootFolder
|-WebCOntent
|-index.html
|-main.js
|-sw.js
|-manifest.json
Исключение, которое я получаю
TypeError: Не удалось выполнить «подписку» для «PushManager»: предоставленное значение не относится к типу «(ArrayBuffer или ArrayBufferView)»
У меня исправлена ошибка типа выше
код ниже работал для меня
const urlB64ToUint8Array = (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 (пусть i = 0; i