因项目需求接触的 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"

pch 文件创建请见此篇文章

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的更多相关文章

  1. Linux版EPUB阅读器

    Linux版EPUB阅读器 如果说用平板电脑看书尚属主流的话,那么在电脑上读书就非常少见了.专注阅读16世纪的书是非常困难的了,没人希望后台蹦出QQ聊天窗口.但是如果你非要在电脑上打开电子书的话,那么 ...

  2. PC端体验效果最佳epub阅读器——iRead爱读书

    官网:http://www.ireadhome.com/

  3. 电子书及阅读器Demo

    电子书阅读器(Kindle,电子纸技术.LCD.电子墨水技术等: 亚马逊/当当网站)  电子书产业可分5大环节:内容供应商.数字格式制作商.内容流通服务平台.传输平台以及终端阅读器产品. 全球电子书市 ...

  4. 使用 Vue 和 epub.js 制作电子书阅读器

    ePub 简介 ePub 是一种电子书的标准格式,平时我看的电子书大部分是这种格式.在手机上我一般用"多看"阅读 ePub 电子书,在 Windows 上找不到用起来比较顺心的软件 ...

  5. SwiftHN阅读器应用IOS源码

    SwiftHN是用Swift语言编写的Hacker News阅读器,同时采用了iOS 8最新的API. <ignore_js_op> <ignore_js_op> 详细说明:h ...

  6. RSS新闻阅读器

    1.RSS格式结构 http://rss.sina.com.cn/blog/tech/kj.xml <?xml version="1.0" encoding="ut ...

  7. 基于React实现的【绿色版电子书阅读器】,支持离线下载

    代码地址如下:http://www.demodashi.com/demo/12052.html MyReader 绿色版电子书阅读器 在线地址:http://myreader.linxins.com ...

  8. 使用multiprocessing解决PyMuPDF不支持多线程加载导致的界面卡死无响应问题,及一个PyQt5实现的简易PDF阅读器例子

    最近在用PyMuPDF实现一个PDF阅读器,发现PyMuPDF在加载某些epub时耗时非常长,有的长达10几秒,会导致界面卡死无响应. 尝试用多线程后台加载,发现还是不能解决问题,和作者交流(issu ...

  9. 基于Core Text实现的TXT电子书阅读器

    本篇文章的项目地址基于Core Text实现的TXT电子书阅读器. 最近花了一点时间学习了iOS的底层文字处理的框架Core Text.在网上也参考很多资料,具体的资料在文章最后列了出来,有兴趣的可参 ...

随机推荐

  1. js-JavaScript的简介

    JavaScript的简介 * 是基于对象和事件驱动的语言,应用于客户端 - 基于对象: ** 提供好了很多对象,可以直接拿过来使用 - 事件驱动: ** HTML做网站静态效果,JavaScript ...

  2. [SYZOI Round1] 滑稽♂树

    题面 传送门 Sol 我也不知道哪里来的题目哪里来的\(OJ\) 子树变成\(DFS\)序后就是裸的树套树 # include <bits/stdc++.h> # define RG re ...

  3. Oracle基础之分析表

    analyze table tablename compute statistics; analyze index indexname compute statistics; (analyze 不会重 ...

  4. pt-duplicate-key-checker使用

    pt-duplicate-key-checker工具可以检测表中重复的索引,对于一些业务量很大的表,而且开发不规范的情况下有用.基本用法: 看一下我们的测试表: mysql> desc new_ ...

  5. easyui datagrid行编辑中数据联动

    easyui的datagrid中行内编辑使用数据联动.即:当编辑产品编号时,该行的产品名称自动根据产品编号显示出来. 在编辑中获取当前行的索引 function getRowIndex(target) ...

  6. C++ 类的存储方式以及虚函数表

    一.C++成员函数在内存中的存储方式 用类去定义对象时,系统会为每一个对象分配存储空间.如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间.按理说,如果用同一个类定义了10个对象,那么就 ...

  7. python 面向对象:类,作用域

    类(Class)和实例(Instance) 定义类是通过class关键字:class Student(object): pass class后面紧接着是类名,即Student接着是(object),表 ...

  8. mysql主从同步与防火墙端口的设定

    一.背景: 之前做主从同步时,把从库防火墙关了,现在开启防火墙后,从库不同步了 二.解决思路: 1.首先查看了mysql占用的端口,然后开启,tcp/udp都开了,结果还是不行 firewall-cm ...

  9. ranger文件管理器

    我是一个 CLI 控,但一直苦于没有一个好用的文件管理器.虽然 vifm 的 vim 键绑定很合我的胃口,但它实在不好用.所以我一直没有停止过寻找类似软件的念头.直到尝试了 Ranger, 觉得很不错 ...

  10. [原]Android打包之Eclipse打多渠道包

    Android自动打包流程详细图: 步骤一和步骤二参考:[原]Android打包之Eclipse打包 步骤三:编写build.xml <?xml version="1.0" ...