1

Cocoa 的 WebView 可以显示 .webarchive 文件。我尝试显示的内容来自粘贴板,例如在 Safari 或 Mail.app 中复制网页的部分内容时。

我遇到的问题是来自 Mail 和 Notes 的 webarchives 不会显示在 WebView 中,而来自 Safari 的 webarchives 会显示。

我查看了这些档案的数据(BBEdit 可以解密它们的二进制 plist 格式并将其很好地显示为 XML),发现问题是由 Mail(和 Notes)放在那里的不寻常的 URL 引用引起的:

<key>WebResourceURL</key>
<string>x-msg://4/</string>

如果我删除该条目或使用 http:// 将其更改为某些内容,WebView 突然可以显示此类存档。

现在,我如何在我的代码中解决这个问题?

我不想解码 webarchive,找到 WebResourceURL 条目并将其删除,然后再将存档传递给 WebFrame 进行加载。

我想知道我是否必须使用 WebView 或其主框架设置其他东西才能完成这项工作。

我注意到 Xcode 可以很好地显示这些 webarchives,这表明 Xcode 以更“正确”的方式使用 WebKit 来解决问题。但是,也许这只是因为它让 NSWebFrame 从磁盘加载存档,而我的代码从 CFData 对象加载它 - 从文件加载时,WebKit 可能使用该文件 URL 作为基本 URL,而它只会阻塞它当它根本没有获得可用的 URL 时。


我在这里为 Xcode 创建了一个小演示项目:http: //files.tempel.org/Various/Mail-WebArchive-Display-Issue.zip

它包括来自 Mail 的原始存档(“mail-bad.webarchive”)和固定存档(“mail-good.webarchive”),两者都显示在演示应用程序的两个 webView 中。


我还使用 Apple DTS 打开了技术支持 Indident (TSI),并回复说我应该提交错误。可以在此处查看错误报告:http: //openradar.appspot.com/radar?id= 2843403

4

1 回答 1

0

在考虑了 Xcode 可能在做什么之后,我找到了一个解决方案:

这不起作用:

WebArchive *archive = [[WebArchive alloc] initWithData:webData];
[[webView mainFrame] loadArchive:archive];

但这确实:

[[webView mainFrame] loadData:webData MIMEType:@"application/x-webarchive" textEncodingName:@"" baseURL:NULL];

因此,加载档案的显式功能是错误的,而想要一个显式 URL 的功能,即使我没有给它,也可以工作。

去搞清楚。

于 2013-03-12T21:37:01.077 回答