NotFoundError : DOM IDVDatabase Exception 8 - while using dexie on ipad (working on desktop chrome & safari))
NotFoundError : DOM IDVDatabase Exception 8 - while using dexie on ipad (working on desktop chrome & safari))
我正在开发使用带包装器的 IndexedDB 的应用程序 dexie.js。它在桌面 Chrome 和 Safari 上运行良好,但显示以下错误:
NotFoundError : DOM IDVDatabase Exception 8" on iPad (iOS 9.3.5).
最近 iOS iPad 它工作正常,没有错误。我需要一个修复程序,使其适用于所有 iOS 版本。
我已尝试应用 github 和 Whosebug 上可用的修复程序,但没有成功。
谢谢。任何帮助将不胜感激。
对您的问题进行了一些研究和复现。这不是一件容易的事,因为 IndexedDBShim 3.7.0 似乎没有正确完成它的工作。幸运的是,我们有 2.x 版本的 shim,它在 iOS 9 上的表现符合预期:-)
好的,所以我现在确实为此做了几个小时的研究,在 Browserstack 等上对其进行了测试,并找到了一个应该真正有效的解决方案。请注意,IndexedDBShim 本身也存在一些问题,但 Dexie 中的基本功能应该比 iOS 8 和 9 上的原生 IndexedDB 更好。
将以下代码段插入到为您的应用程序提供服务的 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(或您的 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://whosebug.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;
}
包含这样的 shim 的好处是它不会影响不需要它的浏览器的性能。
注意:当您的用户更新他们的设备并获得更新版本的 Safari 时,Dexie 将开始使用本机 IndexedDB,这当然是空的。如果不需要,您将需要进行一些更高级的检查或将数据库迁移到 indexedDB,这不是此响应的一部分。不过,通常情况下,应用程序应始终考虑到数据库可能会丢失(比如用户清除它),并且在发生这种情况时能够从服务器重新填充它们。
我正在开发使用带包装器的 IndexedDB 的应用程序 dexie.js。它在桌面 Chrome 和 Safari 上运行良好,但显示以下错误:
NotFoundError : DOM IDVDatabase Exception 8" on iPad (iOS 9.3.5).
最近 iOS iPad 它工作正常,没有错误。我需要一个修复程序,使其适用于所有 iOS 版本。
我已尝试应用 github 和 Whosebug 上可用的修复程序,但没有成功。
谢谢。任何帮助将不胜感激。
对您的问题进行了一些研究和复现。这不是一件容易的事,因为 IndexedDBShim 3.7.0 似乎没有正确完成它的工作。幸运的是,我们有 2.x 版本的 shim,它在 iOS 9 上的表现符合预期:-)
好的,所以我现在确实为此做了几个小时的研究,在 Browserstack 等上对其进行了测试,并找到了一个应该真正有效的解决方案。请注意,IndexedDBShim 本身也存在一些问题,但 Dexie 中的基本功能应该比 iOS 8 和 9 上的原生 IndexedDB 更好。
将以下代码段插入到为您的应用程序提供服务的 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(或您的 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://whosebug.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;
}
包含这样的 shim 的好处是它不会影响不需要它的浏览器的性能。
注意:当您的用户更新他们的设备并获得更新版本的 Safari 时,Dexie 将开始使用本机 IndexedDB,这当然是空的。如果不需要,您将需要进行一些更高级的检查或将数据库迁移到 indexedDB,这不是此响应的一部分。不过,通常情况下,应用程序应始终考虑到数据库可能会丢失(比如用户清除它),并且在发生这种情况时能够从服务器重新填充它们。