最近测试报了个bug,若手头有iOS7.0的也可以试试。

  1. 打开safari,输入m.taobao.com,打开淘宝
  2. 新建一个窗口,随便输入一个网址打开,像百度
  3. 在同一个窗口,再次输入m.taobao.com,加载完毕
  4. 发现后退按钮没有亮起来,没法后退到前一个页面百度了。

诶?!

几个人绕了半天的圈圈,最终终于通过打印UIWebView的前进后退列表得知原因,见下图:

淘宝居然被当成了百度的iFrame了?!我了个去!

小伙伴们继续深挖,发现越来越多的页面都有这个问题。由于清除缓存,或者第一次打开这些页面,都没有这个问题,可以确定是页面缓存导致的。最终定位到这些页面都有一个特点,就是都指定了manifest,也就是说使用了application cache。

这让我们那个严重依赖前进后退列表的应用bug百出。其他UI的bug也就算了,iOS7.0的正式版的safari,居然冒出了这么严重的底层bug?!

想起几天前看到的彩蛋,大意就是,iOS7中的头文件中发现了用骂人的话来命名的接口。有个回复确实表达了我当时的心情:

苹果第一次让我感到这么失望……

更多的iOS7 Safari的问题,可以参考这里,回复中吐槽的可真不是一般的多。本想回个贴讨论一下,没想到已经有很多人吐槽这个问题了:

UPDATE 19/9: If you are using Application Cache and also managing states through hash or other technique, the history object will not keep your navigation history, therefore history.back() will never work and history.length stays in 1 forever. (Thanks to 10+ people who reported this problem!)

除此之外,那篇文章还讲了其他问题(更多是涉及前端的问题。英文版看得太辛苦的,这里有翻译):

  1. 网页捕捉不到底部工具条(toolbar)出现和消失的时机
  2. 在旧版本的Safari上,window.scrollTo 是用来置顶页面使顶部地址栏消失,现在work不了
  3. 地址栏变小(横屏下为消失)和底部工具条(toolbar)消失的事件,只能用户自己滑动页面来触发。但是有些html5页面自己维护了页面滑动,而非使用UIWebView原生的UIScrollView,由于第2点也work不了,结果就悲剧了(无法全屏)
  4. 将某个长网页滑动最底部,此时Safari处于全屏状态下(地址栏缩小,底部工具条消失),点击页面最底部的链接,此时并不是打开新链接,而是变成非全屏状态(即弹出地址栏和底部工具条),还得麻烦您老再点一次
  5. 为了节省空间,没地方显示网页标题了……
  6. Safari增加了左右滑动的手势,进行页面前进后退,但它也没解决一个永恒的问题,就是如何处理和网页手势的冲突问题(比方说现在很多网页都有横向滑动的照片展示墙)
  7. 渲染的网页永远只有一个,但是左右滑动需要看到前后的页面,这时候就需要截图了(研究过具体的机制,可以以后再讲讲)。有些webapp的网页在重新加载之后会自动置顶,这时和截图的位置的不一样了,看起来有点别扭就是了
  8. 图标大小也变大了几个像素啊魂淡
  9. 网页中,input type=”datetime”显示为文本输入,不再是日期输入框了(苦逼的前端)
  10. webapp受灾最为严重:除了上面没有维护前进后退列表之外,对话框也不好使了,添加到桌面时,cookie也不共通了……

对于我这个浏览器软件的终端开发,最近最苦恼的事情,莫过于Mac OS上的Safari的Inspector调试iOS 7设备时bug连连。

当然,也有一些好消息的:

  1. 网页视频支持字幕语言选择了
  2. iframe支持seamless属性,而且,居然能够自适应高度
  3. 增加了js和css接口
  4. UIWebView增加了类似于电子书相关的接口(未经测试)
  5. 新增加了JavaScriptCore framework