iOS Safari阅读模式研究

原创 2016年03月23日 00:08:58

这是一篇在2013年准备的资料,现在分享出来,供有需要的同学参考。

要点

(1) 阅读模式的检测
在frame加载完成后,触发一个timer来检测是否可以使用阅读模式。检测的方式是使用JavaScriptCore framework的接口执行一段JS脚本,然后取JS中属性值来判断是否可以进入阅读模式。如果当前页面可以进入阅读模式,将在地址栏显示阅读模式切换按钮。

(2) 阅读模式的执行
  当用户点击阅读模式切换按钮时,会依次执行:

i. 执行阅读模式检查脚本,判断目前是否可以进入阅读模式。
ii. 创建WebView并加载阅读模式页面的HTML页面,iPad下为Reader~iPad.html .
iii. 在页面允许修改Window对象的位置,执行阅读模式处理脚本。
v. 显示页面

(3) 阅读模式页面的控制
 Safari实现了几个类来处理阅读模式的显示和操作。

主要涉及的类

classes
TabDocument代表了一个页签下的页面文档,这里有页面的主要控制操作和阅读模式的控制操作(ReaderControllerDelegate)。
BrowserReaderView是负责阅读模式页面显示的类。

阅读模式检测的序列图

下面是一个在正常页面加载后触发TabDocument_readerAvailabilityDetectionTimer的序列图:
sequence #1

除此之外,另外两个函数-[BrowserController stopFromAddressView:]-[TabDocument _progressDidStall] 也会触发阅读模式检测的执行。

当Timer触发后会开始真正执行脚本:
sequence #2

JSEvaluateScript,JSObject等都是JavaScriptCore framework提供的接口。

执行完成脚本,会执行回调函数-[TabDocument _didDetectReaderAvailability:]将把脚本中的ReaderArticleFinder.isReaderModeAvailable的值传入,再根据这个值判断是否要显示阅读模式按钮。

阅读模式的显示

当点击阅读模式按钮时,下图的2.1是重新发起检测脚本的执行,步骤2.2则开始加载显示阅读模式。
sequence #3

WebView放出一个接口webView:didClearWindowObject:forFrame,允许用户修改全局对象, Safari就是在这个位置提前于页面真正加载就去执行阅读模式处理脚本,然后在页面加载完时会依据下面的写法,执行ReaderJS.loaded(),显示页面内容。

<body class="preloading"onload="ReaderJS.loaded();" onscroll="articleHasScrolled();">

ReaderJS就是阅读模式内容抽取脚本中的对象。

下面是执行阅读模式内容抽取的脚本执行过程:
sequence #4

*这是Apple关于webView:didClearWindowObject:forFrame的说明:

Use this method to set custom properties on the window object before the page is actually loaded. Every time a frame loads or is reloaded all DOM properties are cleared from the window object so the new page has a fresh window object to use. If the page you are loading depends on specific window object properties to exist, they should be added at this point before any scripts are executed.

附上三个使用到文件,分别是:
Reader~ipad.html iPad下使用的阅读模式页面html文件
safari_reader_check.js 阅读模式检测JS脚本
safari_reader_clicked.js 阅读模式内容抽取JS脚本
到GitHub上查看,链接:iOSSafariReaderMode

参考

. 分析的过程记录

相关文章推荐

创建chrome右键菜单划词搜索扩展

转载请注明出处:http://blog.csdn.net/zhymax/article/details/8552830       上网时经常在多个搜索引擎间切换,但使用chrome自带的搜索引...
  • Zhymax
  • Zhymax
  • 2013年01月29日 15:58
  • 4359

RSS源推荐大全(it版)

虽然早就有人说rss已死,但是喜欢rss的人还是相当的多,最近使用鲜果连播的安卓版,感觉非常爽,自己也喜欢收集一下rss源,在这里推荐一些比较适合it朋友的rss 互联网资讯类 译言网,顺...
  • youacai
  • youacai
  • 2012年03月23日 12:59
  • 36420

iOS Safari阅读模式分析过程

本文为Safari阅读模式分析过程记录,没有做很好的整理。详细看另外一篇.

Safari插件机制研究(一)

Overview 在Safari里有一个单例对象WebPluginDatabase负责管理本地的插件,每个plugin对应一个WebBasePluginPackage,存放在plugins里...

Safari插件机制研究(二) 插件的视图管理

Note:首先相对于WebKit官网的代码,iOS上的版本使用WAKView代替了NSView。 比如Mac OS中将PlatformWidget定义为 NSView*, 而在iOS中则是WAKVie...

踩坑路上——IOS Safari浏览器下固定定位position:fixed带来的问题与解决方案

1.-webkit-overflow-scroll:touch; 2.使用其他布局方式
  • grsghh
  • grsghh
  • 2017年03月11日 14:37
  • 5000

ios7:实现类似于人人、safari的可动态调整大小的导航条以及类似于雅虎天气的全透明导航条

****转载请注明出处一、可动态调整大小的导航条要想调整导航条(NavigationBar)的大小或位置,只需改变他的frame即可。但怎样让导航条上的那些控件(按钮、标题、searchbar之类的)...

iOS 开发之 使用SFSafariViewController读取Safari的cookie

UIWebView 始祖级别,支持的iOS版本比较多 可支持打开URL,包括各种URL模式,例如 Https,FTP等 可支持打开各种不同文件格式,例如 txt,docx,ppt,,音视频文件等,很多...

Safari杀手:iOS 版 Google Chrome 上手评测(视频)

谷歌Chrome浏览器在台式机和笔记本上一直是速度最快的,今天它正式登陆 App Store,这意味着 iOS 平台上苹果自家的 Safari 浏览器终于迎来了一个“杀手级”的竞争对手。另一方面广...

iOS Safari和UIWebView对orientationchange事件的实现

背景知识: Safari Web Content Guide中关于orientationchange的文档: http://developer.apple.com/library/ios/docume...
  • hursing
  • hursing
  • 2013年06月07日 19:56
  • 4877
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS Safari阅读模式研究
举报原因:
原因补充:

(最多只允许输入30个字)