从Mail.app和Notes.app显示WebArchive

时间:2013-03-11 22:37:12

标签: cocoa webview webarchive

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

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

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

<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一起开设了技术支持事故(TSI),并回复说我应该提交一个错误。错误报告可以在这里看到:http://openradar.appspot.com/radar?id=2843403

1 个答案:

答案 0 :(得分:0)

在沉思Xcode可能正在做的事情之后,我找到了一个解决方案:

这不起作用:

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

但这样做:

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

因此,加载存档的显式函数是错误的,而想要显式URL的那个,即使我不给它,也可以。

去图。