因項(xiàng)目需求接觸的 EPub 閱讀器,前前后后嘗試了很多庫(kù),最后找到了個(gè)相對(duì)兼容不錯(cuò)的展開(kāi)了調(diào)試;
其中對(duì)解壓縮和數(shù)據(jù)加載方面進(jìn)行了改造優(yōu)化,使其更加的完美;
GitHub: https://github.com/survivorsfyh/YHEpubDemo
其大概原理是首先將 epub 文件解壓后得到其資源文件包,其中會(huì)包含相應(yīng)的文件夾,通過(guò) OEBPS 文件夾中的資源文件提取所需的數(shù)據(jù)并進(jìn)行拼裝后渲染;
其中包含了文件的解壓縮和通過(guò) touchXML 對(duì) xml 數(shù)據(jù)的解析和寫(xiě)入;
對(duì) xml 解析獲取到節(jié)點(diǎn)內(nèi)容并保存,遍歷數(shù)據(jù)數(shù)組找到其中所需的節(jié)點(diǎn),將其遍歷節(jié)點(diǎn)得到所需屬性的 name 和 value 作為字典對(duì)象填充至模型.
/**
解析 OPF 文件,從 ncx 讀取書(shū)籍目錄
@param opfRelativePath 文件相對(duì)路徑
@param bookInfoModel 數(shù)據(jù)填充模型
@return 結(jié)果集
*/
+ (NSArray *)parseOPF:(NSString *)opfRelativePath bookInfoModel:(LPPBookInfoModel *)bookInfoModel {...}
具體內(nèi)容還是直接通過(guò) Demo 中的 code 表述更加直觀,Demo 中也包含了一些注釋看著相對(duì)較為輕松;
關(guān)于 SDK 集成
1)首先,引入'SSZipArchive',通過(guò)該解壓進(jìn)行對(duì) EPub 文件的解壓,獲取其文件資源;
2)其次,引入'MWPhotoBrowser'庫(kù),此處需要注意因'MWPhotoBrowser'庫(kù)已經(jīng)將'SDWebImage'和'MBProgressHUD'兩個(gè)庫(kù)包含其中.若項(xiàng)目中已經(jīng)引入上面兩個(gè)庫(kù)可以直接通過(guò)'MWPhotoBrowser'來(lái)代替,避免導(dǎo)致文件沖突的異常;
3)最后,引入'DTCoreText',將 html 字符串轉(zhuǎn)化為富文本使用的工具,保證原生實(shí)現(xiàn)的同時(shí)起到靈活修改樣式的功能,且在性能方面相比 WebView 加載方式更具優(yōu)勢(shì).
platform :ios, '8.0'
target "TestEpub" do
pod 'SSZipArchive'
pod 'DTCoreText'
pod 'MWPhotoBrowser', '~> 2.1.2'
end
關(guān)于項(xiàng)目集成后配置
1)將頭文件引入至 pch 文件中
#import "XDSReaderHeader.h"
pch 文件創(chuàng)建請(qǐng)見(jiàn)此篇文章
2)編譯會(huì)拋出 arc 的文件異常,勿慌,此異常由于類(lèi)文件包中的文件所引起
按照下圖所示步驟,在所對(duì)應(yīng)的類(lèi)中添加"-fno-objc-arc"即可搞定
3)arc 異常處理完畢后再次編譯程序會(huì)再次提示文件缺失的異常信息
工程文件層級(jí)目錄中對(duì)文件進(jìn)行檢索"mdjyml"后將其文件刪除,再次編譯工程即可搞定
關(guān)于方法調(diào)用
配置好文件路徑后調(diào)用如下方法即可
// 張學(xué)良傳 TestEpub
NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"張學(xué)良傳"withExtension:@"epub"];
dispatch_async(dispatch_get_global_queue(0, 0), ^{
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文件名稱(chēng)xx"]];
// 文件檢索
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath:filePath]) {
[MBProgressHUD showError:@"暫無(wú)此書(shū)" toView:controller.view];
return;
}
NSURL *fileURL = [NSURL fileURLWithPath:filePath];
// Reading book
dispatch_async(dispatch_get_global_queue(0, 0), ^{
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 中含示例文件)后編譯即可查閱效果;
效果樣式圖
以上便是此次 Epub 閱讀器的小結(jié),首次搞還望多多指教.