API доступа к хранилищу Safari ITP 2.0 - запрос на вложение проблемStorageAccess в hasStorageAccess - не вложенные работы - PullRequest
0 голосов
/ 19 декабря 2018

В настоящее время я пытаюсь реализовать вызов API доступа к хранилищу, но у меня возникают проблемы с вложением вызова requestStorageAccess в hasStorageAccess.

Вот схема кода - она ​​довольно стандартная:

  requestStorageAccessAndServe() {
    let thisObject = this;
    var promise = document.hasStorageAccess();
      promise.then(
        function (hasCookieAccess) {
          if (!hasCookieAccess) {
            document.requestStorageAccess().then(
                function successful() {
                  // reload iframe to run with cookie access
                  window.location.reload();
                },
                function fail() {
                  thisObject.serveContent();  // Code goes into here
                });
          } else {
            thisObject.serveContent();
          }
        },
        function (reason) {
          thisObject.serveContent();
        }
      );

  }

Когда я нажимаю на кнопку, чтобы вызвать этот метод, я всегда попадаю в эту функцию «сбой», когда не появляется запрос на доступ к хранилищу.

Удивительно, но этот не вложенный код работает отлично:

  requestStorageAccessAndServe() {
    let thisObject = this;
    let hasCookieAccess = !!document.cookie;
    if (!hasCookieAccess) {
      document.requestStorageAccess().then(
          function successful() {
            window.location.reload();
          },
          function fail() {
            thisObject.serveContent();
      });

    } else {
      thisObject.serveContent();
    }
  }

Этот код работает - он перезагружает iframe при первом запросе, а затем передает данные после другого запроса на перезагрузку, но проверка доступа к файлам cookie выполняется с помощью !! document.cookie чрезвычайно хакерски (что еслив первую очередь нет данных cookie), и я больше пытаюсь понять, что здесь происходит не так.У кого-нибудь есть идеи?

Для возможного решения есть ли способ принудительного разрешения document.hasStorageAccess (), поэтому мне не нужно его вкладывать?

Редактировать:

Не помогло и обещание решить.См. Пример кода:

  async requestStorageAccessAndServe() {
    let thisObject = this;
    let hasCookieAccess = await document.hasStorageAccess();
    if (!hasCookieAccess) {
      document.requestStorageAccess().then(
          function successful() {
            window.location.reload();
          },
          function fail() {
            thisObject.serveContent();
      });

    } else {
      thisObject.serveContent();
    }
  }

Все еще входит в эту функцию "сбой" ...

1 Ответ

0 голосов
/ 21 декабря 2018

Проблема в том, что requestStorageAccess () требует вызова пользователя.Вложив его в обещание hasStorageAccess (), пользовательское намерение (щелчок) скрывается, а Safari автоматически отклоняет запрос.

Чтобы противодействовать этому, я разрешаю hasStorageAccess при загрузке iframe (поскольку он не требует намерения пользователя), сохраните этот результат в переменной класса, а затем, если он разрешится в false, я проверяю requestStorageAccess по клику.

...