非常感谢大家利用自己宝贵的时间来阅读我的文章 , 最近做了一个用到Epub阅读的项目,下面跟大家分享一下开发心得,希望能给你的开发过程带来一些帮助。喜欢的可以关注一下我的简书、我的博客
关于epub阅读器,我是在github上找了个叫XDSReader的开源阅读器做了些修改,研究了一下他的源码,修改了些BUG,包括笔记的删除,书签章节名称错乱,首页点击第一章崩溃等小问题,具体都是在什么地方做的修改都忘得差不多了,这篇文章的重点不在这,也就不再多说了。
因为某些不知名的保密原因,公司不允许直接下载原始epub文件,让研究一下加密方式,做了一天尝试,感觉最好的方式就是对epub中所有的xhtml文件内容进行AES128加密,客户端下载加密后的epub文件,在阅读的过程中对xhtml文件进行解密。
具体的实现方式是后台开发人员找了个第三方,具体什么第三方我不清楚,能实现我想要的功能就行了,就是可以遍历epub里的所有文件,针对xhtml文件类型进行IO流的AES128加密,加密完成后输出加密后的epub文件,客户端这边下载完成后调用XDSReader进行epub阅读,当然,要对他的源码做些修改,修改之前先跟踪XDSReader解析epub文件过程
1、解析opf文件,获取epub基本信息
2、解析ncx文件,获取章节信息
3、通过获取的章节列表信息加载解析对应的xhtml文件
4、使用DTCoreText进行富文本展示
我们只需要在第三步的时候改下解析xhtml的代码,对xhtml文件的内容做次AES128解密就行了,具体代码位置在XDSChapterModel.m文件里的attrubutedStringForSnippet方法里,不管用什么阅读器,epub的解析应该是大同小异的。
NSString *OEBPSUrl = CURRENT_BOOK_MODEL.bookBasicInfo.OEBPSUrl;
OEBPSUrl = [APP_SANDBOX_DOCUMENT_PATH stringByAppendingString:OEBPSUrl];
NSString *fileName = [NSString stringWithFormat:@"%@/%@", OEBPSUrl, self.chapterSrc];
// Load HTML data
readmePath = fileName;
html = [NSString stringWithContentsOfFile:readmePath encoding:NSUTF8StringEncoding error:NULL];
把
html = [NSString stringWithContentsOfFile:readmePath encoding:NSUTF8StringEncoding error:NULL];
替换为
NSData *data = [NSData dataWithContentsOfFile:readmePath];
NSData *DecryptData = [data AES128DecryptWithKey:@"AES128密匙字符串" iv:@"AES128偏移量字符串"];
html =[[NSString alloc] initWithData:DecryptData encoding:NSUTF8StringEncoding];
这样就可以实现epub文件的加密啦,注意,对epub加密的时候只加密xhtml格式的文件就行了,要不解析其他文件的代码也要做相应修改,麻烦且容易出问题,只对xhtml文件加密可以在实现加密的基础上减轻很大的工作量,还是可取的,OK这是我对epub加密实现的一知半解,如果有其他见解,欢迎讨论交流~
网友评论