带有 iOS 8/ Safari 的 IndexedDB

Posted

技术标签:

【中文标题】带有 iOS 8/ Safari 的 IndexedDB【英文标题】:IndexedDB with iOS 8/ Safari 【发布时间】:2014-12-04 16:48:12 【问题描述】:

我们有一个测试用例来测试不同浏览器和操作系统的 indexeddb。 这只是简单的测试:

     open database, add some data, retrieve some data

就是这样。它在 Chrome (39)、Firefox(新版本)、带有 OSX 9.5 的 MacBook Pro、基于 android 的浏览器中完美运行。

当我们在 ios 8 中尝试使用 Ipad3 时,页面没有做任何事情。而且我们也看不到任何错误。

任何想法,如何解决问题?

我们使用了应该有帮助的 indexeddb.shim.js 文件,但仍然无法正常工作。

 if (!window.indexedDB) 
     window.alert("Your browser doesn't support a stable version of IndexedDB.")
 

 var request = indexedDB.open("kitta db1");

 request.onupgradeneeded = function() 
       //create Store and etc
 ;

 request.onsuccess = function() 
   db = request.result;

 ;

iOS 8 中的错误:

类型错误:null不是Object就行了:

 var request = indexedDB.open("kitta db1");

知道如何解决吗?

【问题讨论】:

【参考方案1】:

看起来变量 indexedDB 为空。 polyfill 这样做:

e.indexedDB=e.indexedDB||e.webkitIndexedDB||e.mozIndexedDB||e.oIndexedDB||e.msIndexedDB 

所以它将变量设置为这些值之一。如果这些值都是 undefined/null,则 indexedDB 变量保持为 null。

测试这些变体是否具有值(减去 Microsoft、Opera 和 Mozilla)的简单方法如下:

console.log('indexedDB: ', indexedDB);
console.log('webkitIndexedDB: ', webkitIndexedDB);

如果 webkitIndexedDB 未定义而 indexedDB 未定义,那么 iOS 显然不支持 indexedDB。

一个简单的search on caniuse.com 表示支持iOS8 和iOS8.1 上的indexedDB but buggy。

【讨论】:

两者都返回 IDBFactory 我猜这意味着它们不为空并且 iOS 支持两者。我听说过这个错误,但有什么解决方法或 API 可以修复它吗? 如果它们不为空,那么您可能不需要使用 shim。您的周围代码还有其他问题导致 indexedDB 变量未定义。也许需要 indexedDB.open 的版本参数。也许使用窗口正在做一些意想不到的事情。尝试使用不带空格的数据库名称。 我只是尝试了一切:版本号,尝试所有数据库名称的组合,仍然是同样的错误。与其他设备和浏览器完美兼容,但不适用于带有 Safari 的 iOS 8.1。它适用于 MacBook Pro 上的 Safari,虽然对我来说有点奇怪。

以上是关于带有 iOS 8/ Safari 的 IndexedDB的主要内容,如果未能解决你的问题,请参考以下文章

带有自定义控件的视频无法在 iOS 上播放(Safari 和 Chrome)

带有 flexbox 的引导列在 iOS 和 Safari 上的宽度不合适

带有 CSS 的 iOS Safari 滚动问题

在 iOS 9 上从表视图打开 safari 视图控制器并在 iOS 8 或 7 上在 safari 中打开

带有.css左/右的Safari iOS 9.0.2 jquery错误

Javascript 分析 iOS 8 Safari