iPhone UIWebView:loadData不适用于某些类型(Excel,MSWord,PPT,RTF)

时间:2010-05-04 11:10:44

标签: iphone uiwebview webkit

我的任务是在OS 3.x的iPhone上显示支持的文档类型,例如.pdf,.rtf,.doc,.ppt,.png,.tiff等。

现在,我已将这些文件 仅加密 存储在磁盘上。出于安全考虑,我希望避免将它们以未加密的形式存储在磁盘上。

因此,我更喜欢使用loadData:MIMEType:textEncodingName:baseURL:而不是loadRequest:来显示文档,因为loadData允许我传递NSData对象中的内容,即我可以在内存中解密文件并且无需将其存储在磁盘上,因为使用loadRequest时需要它。

问题是loadData似乎不适用于所有文件类型:

测试显示所有图片类型似乎都可以正常工作,而PDF则更好,而更复杂的类型则不然。我收到的错误如下:

NSURLErrorDomain Code=100
NSURLErrorDomain Code=102
尽管我已经通过NSData对象提供了所有内容,但WebView似乎需要一个真正有效的URL来将文档作为文件访问。

以下是我用来显示内容的代码:

[webView loadData:data MIMEType:type textEncodingName:@"utf-8" baseURL:nil];

适当地设置哑剧类型,例如,到.doc文件的“application / msword”。

有谁知道如何让loadData使用loadRequest支持的所有类型?或者,或者,有什么方法可以告诉哪些类型使用loadData确实 (即由Apple正式批准)?然后我可以双重工作,只为loadData不喜欢的情况创建一个临时未加密的文件。

更新

看起来我不是第一个碰到这个的人。见这里:

http://osdir.com/ml/iPhoneSDKDevelopment/2010-03/msg00216.html

所以,我猜,这是现状,我无能为力。

有人提出了可能有用的解决办法:

http://osdir.com/ml/iPhoneSDKDevelopment/2010-03/msg00219.html

基本上,我们的想法是提供一个小的http服务器来提供文件(在我的情况下来自内存),然后使用loadRequest。这可能是内存密集型的,因为服务器和webview可能都将内存中的全部内容保存为两个副本,而不是使用loadData,两者都希望共享相同的数据对象。 (请注意,我必须将解密数据保存在内存中,这就是重点)。

2 个答案:

答案 0 :(得分:8)

我遇到了一个非常类似的问题(我从服务器上获取了我的文件)然后看到了你的帖子并认为这是一个死胡同然后只是偶然开始在设备上进行实验(在这个例子中是iPad)并且它当我把baseURL作为我从服务器上获取它时它工作但它工作但在模拟器上不起作用。我会尝试,否则我会向Apple提交错误报告。

答案 1 :(得分:0)

以下是NSURLProtocol的解决方案:

class CoreDataFileURLProtocol : NSURLProtocol {
    var connection: NSURLConnection!

    override class func canInitWithRequest(request: NSURLRequest) -> Bool {
        return (request.URL.scheme == "coredatafile")
    }

    override class func canonicalRequestForRequest(request: NSURLRequest) -> NSURLRequest {
        return request
    }

    override func startLoading() {
        if let file_id = self.request.URL.absoluteString?.lastPathComponent {
            if let file = SAFile.MR_findFirstByAttribute("file_id", withValue: file_id) as? SAFile {
                let response = NSURLResponse(URL: request.URL, MIMEType: file.mime, expectedContentLength: Int(file.filesize), textEncodingName: "utf-8")
                client?.URLProtocol(self, didReceiveResponse: response, cacheStoragePolicy: .NotAllowed)
                client?.URLProtocol(self, didLoadData: file.data)
                client?.URLProtocolDidFinishLoading(self)
            }
        }
    }

    override func stopLoading() {
    }
}

现在你只需要注册课程:

NSURLProtocol.registerClass(CoreDataFileURLProtocol.self)

使用file_id创建请求:

let url = NSURL(scheme: "coredatafile", host: "myapp.com", path: "/\(file.file_id)")
webView.loadRequest(NSURLRequest(URL: url!))