Сделал некоторые исследования и воспроизведение вашего вопроса.Это было нелегко, так как IndexedDBShim 3.7.0, похоже, не выполняет свою работу правильно.К счастью, у нас есть версия 2.x shim, которая работает должным образом на 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/indexeddbshim@2.x/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 (или вашего пакета веб-пакетов).
приведенного выше фрагмента достаточно для поддержки 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, которая не является частью этого ответа.Однако обычно приложения должны всегда учитывать, что базы данных могут быть потеряны (например, если пользователь их очистит) и иметь возможность повторно заполнять их с сервера, если это так.