Epub 阅读器 - iOS
因项目需求接触的 EPub 阅读器,前前后后尝试了很多库,最后找到了个相对兼容不错的展开了调试;
其中对解压缩和数据加载方面进行了改造优化,使其更加的完美;
其大概原理是首先将 epub 文件解压后得到其资源文件包,其中会包含相应的文件夹,通过 OEBPS 文件夹中的资源文件提取所需的数据并进行拼装后渲染;
其中包含了文件的解压缩和通过 touchXML 对 xml 数据的解析和写入;
对 xml 解析获取到节点内容并保存,遍历数据数组找到其中所需的节点,将其遍历节点得到所需属性的 name 和 value 作为字典对象填充至模型.
/**
解析 OPF 文件,从 ncx 读取书籍目录
@param opfRelativePath 文件相对路径
@param bookInfoModel 数据填充模型
@return 结果集
*/
+ (NSArray *)parseOPF:(NSString *)opfRelativePath bookInfoModel:(LPPBookInfoModel *)bookInfoModel {...}
具体内容还是直接通过 Demo 中的 code 表述更加直观,Demo 中也包含了一些注释看着相对较为轻松;
效果样式图


关于 SDK 集成
1)首先,引入'SSZipArchive',通过该解压进行对 EPub 文件的解压,获取其文件资源;
2)其次,引入'MWPhotoBrowser'库,此处需要注意因'MWPhotoBrowser'库已经将'SDWebImage'和'MBProgressHUD'两个库包含其中.若项目中已经引入上面两个库可以直接通过'MWPhotoBrowser'来代替,避免导致文件冲突的异常;
3)最后,引入'DTCoreText',将 html 字符串转化为富文本使用的工具,保证原生实现的同时起到灵活修改样式的功能,且在性能方面相比 WebView 加载方式更具优势.
platform :ios, '8.0'
target "TestEpub" do pod 'SSZipArchive'
pod 'DTCoreText'
pod 'MWPhotoBrowser', '~> 2.1.2'
end
关于项目集成后配置
1)将头文件引入至 pch 文件中
#import "XDSReaderHeader.h"
2)编译会抛出 arc 的文件异常,勿慌,此异常由于类文件包中的文件所引起

按照下图所示步骤,在所对应的类中添加"-fno-objc-arc"即可搞定

3)arc 异常处理完毕后再次编译程序会再次提示文件缺失的异常信息

工程文件层级目录中对文件进行检索"mdjyml"后将其文件删除,再次编译工程即可搞定


关于方法调用
配置好文件路径后调用如下方法即可
// 张学良传 TestEpub
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"张学良传"withExtension:@"epub"]; dispatch_async(dispatch_get_global_queue(, ), ^{
XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
dispatch_async(dispatch_get_main_queue(), ^{
XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
[[XDSReadManager sharedManager] setResourceURL:fileURL];//文件位置
[[XDSReadManager sharedManager] setBookModel:bookModel];
[[XDSReadManager sharedManager] setRmDelegate:pageView];
[self presentViewController:pageView animated:YES completion:nil];
});
});
文件夹方式读取加载方式
/** 配置文件路径*/
NSString *filePath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject] stringByAppendingPathComponent:[NSString stringWithFormat:@"%@", @"xx文件名称xx"]]; // 文件检索
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:filePath]) {
[MBProgressHUD showError:@"暂无此书" toView:controller.view];
return;
} NSURL *fileURL = [NSURL fileURLWithPath:filePath];
// Reading book
dispatch_async(dispatch_get_global_queue(, ), ^{
XDSBookModel *bookModel = [XDSBookModel getLocalModelWithURL:fileURL];
dispatch_async(dispatch_get_main_queue(), ^{
XDSReadPageViewController *pageView = [[XDSReadPageViewController alloc] init];
[[XDSReadManager sharedManager] setResourceURL:fileURL];
[[XDSReadManager sharedManager] setBookModel:bookModel];
[[XDSReadManager sharedManager] setRmDelegate:pageView];
[controller presentViewController:pageView animated:YES completion:nil];
});
});
Demo 已上传至 GitHub,直接引入所需的 epub 文件(Demo 中含示例文件)后编译即可查阅效果;
https://github.com/survivorsfyh/YHEpubDemo
_______
以上便是此次 Epub 阅读器的小结,首次搞还望多多指教.
Epub 阅读器 - iOS的更多相关文章
- Linux版EPUB阅读器
Linux版EPUB阅读器 如果说用平板电脑看书尚属主流的话,那么在电脑上读书就非常少见了.专注阅读16世纪的书是非常困难的了,没人希望后台蹦出QQ聊天窗口.但是如果你非要在电脑上打开电子书的话,那么 ...
- PC端体验效果最佳epub阅读器——iRead爱读书
官网:http://www.ireadhome.com/
- 电子书及阅读器Demo
电子书阅读器(Kindle,电子纸技术.LCD.电子墨水技术等: 亚马逊/当当网站) 电子书产业可分5大环节:内容供应商.数字格式制作商.内容流通服务平台.传输平台以及终端阅读器产品. 全球电子书市 ...
- 使用 Vue 和 epub.js 制作电子书阅读器
ePub 简介 ePub 是一种电子书的标准格式,平时我看的电子书大部分是这种格式.在手机上我一般用"多看"阅读 ePub 电子书,在 Windows 上找不到用起来比较顺心的软件 ...
- SwiftHN阅读器应用IOS源码
SwiftHN是用Swift语言编写的Hacker News阅读器,同时采用了iOS 8最新的API. <ignore_js_op> <ignore_js_op> 详细说明:h ...
- RSS新闻阅读器
1.RSS格式结构 http://rss.sina.com.cn/blog/tech/kj.xml <?xml version="1.0" encoding="ut ...
- 基于React实现的【绿色版电子书阅读器】,支持离线下载
代码地址如下:http://www.demodashi.com/demo/12052.html MyReader 绿色版电子书阅读器 在线地址:http://myreader.linxins.com ...
- 使用multiprocessing解决PyMuPDF不支持多线程加载导致的界面卡死无响应问题,及一个PyQt5实现的简易PDF阅读器例子
最近在用PyMuPDF实现一个PDF阅读器,发现PyMuPDF在加载某些epub时耗时非常长,有的长达10几秒,会导致界面卡死无响应. 尝试用多线程后台加载,发现还是不能解决问题,和作者交流(issu ...
- 基于Core Text实现的TXT电子书阅读器
本篇文章的项目地址基于Core Text实现的TXT电子书阅读器. 最近花了一点时间学习了iOS的底层文字处理的框架Core Text.在网上也参考很多资料,具体的资料在文章最后列了出来,有兴趣的可参 ...
随机推荐
- AGS API for JS代理页的使用
AGS API for JS代理页的使用 1.概述 代理页即使用后端语言编写的请求转发页面,部署在Web应用端.客户端请求先发送到该代理页,代理页再将该请求转发到服务器处理,服务器处理结果再经代理页转 ...
- API——SendMessageTimeout
原文:http://www.cnblogs.com/lzjsky/articles/1777848.html 函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,并且,如 ...
- ES入门——数组的扩展
1.Array.from() 该方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象,包括ES6新增的数据结构Set和Map.下面是 ...
- C++异常安全
转自:http://www.cnblogs.com/zgfLawliet/p/3417308.html 异常安全的代码是指,满足两个条件 1异常中立性 : 是指当你的代码(包括你调用的代码)引发异 ...
- Netty入门4之----如何实现长连接
前面三章介绍了Netty的一些基本用法,这一章介绍怎么使用Netty来实现一个简单的长连接demo. 关于长连接的背景知识,可以参考<如何使用Socket实现长连接> 一个简单的长 ...
- jq扩展
方法一(不常用)$.myjq = function(){alert("hello myjQuery);}方法二声明:$.fn.myjq=function(){$(this).text(&qu ...
- C++ virtual inheritance ZZ
虚继承 是面向对象编程中的一种技术,是指一个指定的基类,在继承体系结构中,将其成员数据实例共享给也从这个基类型直接或间接派生的其它类. 举例来说:假如类A和类B各自从类X派生(非虚继承且假设类X ...
- Oracle案例06—— OGG-01098 Could not flush "./dirdat/e1000004383" (error 28, No space left on device)
一.前言 自从换了新环境,各种问题层出不穷,如果不是之前积累的经验丰富,估计都歇菜了,看来作为数据库全栈工程师(oracle/mysql/sqlserver/sap hana/pg/mongodb/r ...
- Razor模板引擎 (RazorEngine)
Razor模板引擎不仅在ASP.NET MVC中内置了Razor模板引擎,还有一个开源的RazorEngine, 这样以来我们可以在非ASP.NET MVC项目中使用Razor引擎,甚至在控制台,Wi ...
- 删除datatable的行后,出现“不能通过已删除的行访问该行的信息”的错误,即DeletedRowInaccessibleException
删除datatable的行后,出现“不能通过已删除的行访问该行的信息”的错误 =========================================================== 采 ...