Objective C - 读取从 Dropbox 获得的 ePub 文件

ObjectiveC - Reading ePub File Gotten From Dropbox

所以我对这个很迷茫,而且对 epub 文件来说真的很陌生。我做了一些搜索,但似乎无法将所有内容放在一起。

我的应用程序使用 DropBox 的选择器 API 从用户的 DropBox 文件夹中获取文件。在这种情况下,我想打开一个 .epub 文件。因此,当用户选择一个文件时,DropBox API 返回一个指向该文件的 NSURL 对象。例如:

https://dl.dropboxusercontent.com/1/view/e8bmxpkree6nc67/The%20Art%20of%20War.epub

现在,我尝试了几种不同的工具来尝试读取此文件。最初,我尝试使用 KFEpubKit。但是当我打电话时:

epubURL; // The url from DropBox (shown above)
NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
self.epubController = [[KFEpubController alloc] initWithEpubURL:epubURL andDestinationFolder:documentsURL];
self.epubController.delegate = self;
[self.epubController openAsynchronous:YES]

我会收到无法解压缩文件的错误消息。错误显示为:

Epub Error: Error Domain=KFEpubKitErrorDomain Code=1 "Could not extract epub file." UserInfo=0x170275400 {NSLocalizedDescription=Could not extract epub file.}

我查看了代码并缩小了问题范围。 KFEpubKit 使用 SSZipArchive 工具来解压缩文件。从这一点开始,我有点卡住了。 [SSZipArchive unzipFileAtPath: toDestination:] 调用在与 epubURL.path 一起使用时似乎失败了。我不确定这是否与我的文件是 .epub 扩展名而不是 .zip 扩展名有关。或者在从 DropBox 获取 URL 之后,在将其提供给 KFEpubKit 工具之前,可能还有一些事情要做?

最后,我希望必须使用 UIWebView 显示本书的文本。但我只是不确定如何处理这个 .epub 文件。我应该如何处理来自 Dropbox 的文件?任何帮助深表感谢。

快速浏览表明 SSZipArchive 需要本地文件 URL,而不是远程 HTTP URL。首先尝试下载文件(NSData 的内容为 URL,然后写入某个临时文件)然后创建一个指向临时文件的文件 URL,并将其发送到 KFEpubController:

// Download the file from dropbox
epubURL; // The url from DropBox (shown above)
NSData * epubData = [NSData dataWithContentsOfURL:epubURL];  
NSString * tempPath = [NSTemporaryDirectory() stringByAddingPathComponent:@"temp.epub"];
[epubData writeToFile:tempPath atomically:YES];

NSURL *tempURL = [NSURL URLWithString:tempPath];
NSURL *documentsURL = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
self.epubController = [[KFEpubController alloc] initWithEpubURL:tempURL andDestinationFolder:documentsURL];
// etc.

(凭记忆编码。)所有正常注意事项都适用于此——您需要对下载进行适当的 progress/error 处理,删除临时文件等。