NotFoundError: DOM IDVDatabase Exception 8 - при использовании dexie на ipad (работа на настольных Chrome и Safari))

Я работаю над приложением, которое использует IndexedDB с оболочкой dexie.js. Он отлично работает на настольных компьютерах Chrome и Safari, но показывает следующую ошибку:

NotFoundError: DOM IDVDatabase Exception 8 "на iPad (iOS 9.3.5).

На последнем iOS iPad работает без ошибок. Мне нужно исправление, которое заставит его работать на всех версиях iOS.

Я попытался применить исправления, доступные на github и stackoverflow, но не сработало.

Спасибо. Любая помощь будет оценена по достоинству.


person Shweta    schedule 12.06.2018    source источник
comment
Вы пробовали включать IndexedDBShim? Он делает все возможное, чтобы заполнить пробелы, в которых IndexedDB глючит (старые устройства iOS) или не существует (старые устройства iOS).   -  person David Fahlander    schedule 12.06.2018
comment
Спасибо за ответ Дэвид. Да, я использовал его, но это не сработало.   -  person Shweta    schedule 13.06.2018


Ответы (1)


Провёл небольшое исследование и воспроизведение вашей проблемы. Это было непросто, поскольку IndexedDBShim 3.7.0, похоже, не справлялся со своей задачей. К счастью, у нас есть версия 2.x прокладки, которая работает должным образом на iOS 9 :-)

Хорошо, поэтому я действительно провел несколько часов по этому поводу, протестировал его в Browserstack и т. Д. И нашел решение, которое действительно должно работать. Остерегайтесь мысли, что у самого IndexedDBShim тоже есть некоторые проблемы, но основные вещи в Dexie должны работать лучше, чем собственный IndexedDB на iOS 8 и 9.

Вставьте следующий фрагмент в верхнюю часть HTML-страницы, обслуживающей ваше приложение, предпочтительно в качестве одного из первых тегов сценария в теге HEAD:

<script>
    //
    // Download & use the shim if on buggy Safari (internal version no below 602)
    //
    (function(){

      //
      // Check if we are on Safari
      //
      var isSafari = typeof navigator !== 'undefined' &&
        /Safari/.test(navigator.userAgent) &&
        !/(Chrome\/|Edge\/)/.test(navigator.userAgent);

      if (isSafari) {

        //
        // Check Internal Safari Version
        //
        var safariInternalVersion = [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1];

        if (safariInternalVersion < 602) {

          //
          // Download and apply the shim now!
          //

          // IMPORTANT: Use 2.x version of the shim, as 3.x latest (3.7.0 as of 2018-06-14) does NOT work on iOS 9!
          document.write('<script src="https://unpkg.com/[email protected]/dist/indexeddbshim.js">\x3C/script>');
          // IMPORTANT: Force the shim to be used, as itself do not inforce automatically for certain buggy versions.
          document.write('<script> shimIndexedDB.__useShim(); \x3C/script>');
        }
      }
    })()
</script>

ВАЖНО: этот сценарий должен предшествовать включению dexie.js (или вашего пакета webpack).

Приведенного выше фрагмента достаточно для поддержки Safari 9. Safari 8 требует еще одного небольшого JS-кода в дополнение к сценарию выше. Фрагмент должен выполняться после включения Dexie (независимо от стратегии включения), но перед первым использованием Dexie:

  //
  // Also support Safari 8, where indexedDB is non-configurable on
  // window object, making the shim unable to do its work.
  // 
  // What we do here is to manually connect Dexie with the shim
  // in case the shim has been included by the script described at:
  // https://stackoverflow.com/posts/50855488
  //
  // This snippet should execute after including Dexie (no matter 
  // include strategy), but before using Dexie first time:
  //
  if (typeof shimIndexedDB !== 'undefined') {
    Dexie.dependencies.indexedDB = shimIndexedDB.modules.shimIndexedDB;
    Dexie.dependencies.IDBKeyRange = shimIndexedDB.modules.IDBKeyRange;
  }

Приятная вещь с включением такой прокладки заключается в том, что она не повредит производительности браузеров, в которых она не нужна.

ВНИМАНИЕ: когда ваши пользователи обновят свое устройство и получат более новую версию Safari, Dexie начнет использовать собственный IndexedDB, который, конечно же, будет пустым. Если это нежелательно, вам нужно будет выполнить более сложные проверки или перенести базу данных в indexedDB, что не является частью этого ответа. Однако обычно приложения всегда должны учитывать, что базы данных могут быть потеряны (например, если пользователь очищает их), и иметь возможность повторно заполнить их с сервера, если это так.

person David Fahlander    schedule 14.06.2018
comment
Спасибо, что уделили время этому, Дэвид :) Я попробую это и расскажу, как это происходит. - person Shweta; 15.06.2018
comment
Приятно слышать, что это сработало для вас. Проголосуйте за мой ответ, чтобы другие, у кого возникла такая же проблема, заметили, что это рабочее решение. - person David Fahlander; 06.07.2018