В библиотеке веб-push не удается создать веб-push-уведомление в Google Chrome с типом ошибки «(ArrayBuffer или ArrayBufferView)» - PullRequest
0 голосов
/ 10 января 2019

Я хочу отправить 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
...