NotFoundError:DOM IDVDatabase例外8 - 在ipad上使用dexie(使用桌面chrome& safari))

时间:2018-06-12 02:31:15

标签: indexeddb dexie

我正在使用带有包装器dexie.js的IndexedDB的应用程序。它在桌面Chrome和Linux上运行良好。 Safari但显示以下错误:

  

NotFoundError:DOM IDVDatabase例外8"在iPad上(iOS 9.3.5)。

在最新的iOS iPad上,它的工作没有错误。我需要一个修复程序,使其适用于所有iOS版本。

我试图应用github&上可用的修复程序。 stackoverflow但没有工作。

谢谢。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

对您的问题进行了一些研究和复制。这并不容易,因为IndexedDBShim 3.7.0似乎没有正确地完成它的工作。幸运的是,我们有2.x版本的垫片,其行为与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://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,这不是此响应的一部分。通常情况下,应用程序应始终考虑数据库可能丢失(如果用户清除它)并且能够从服务器重新填充数据库(如果是这样)。