1

Cocoa の WebView は .webarchive ファイルを表示できます。Safari や Mail.app で Web ページの一部をコピーする場合など、ペーストボードから表示しようとしているものです。

私が抱えている問題は、Mail と Notes からの Web アーカイブは WebView に表示されませんが、Safari からの Web アーカイブは表示されるということです。

これらのアーカイブのデータを調べたところ (BBEdit は、バイナリ plist 形式を解読し、XML として適切に表示できます)、メール (およびメモ) がそこに配置した異常な URL 参照が原因であることがわかりました。

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

そのエントリを削除するか、http:// を使用するものに変更すると、WebView は突然そのようなアーカイブを表示できます。

さて、コードでこれを一般的に解決するにはどうすればよいですか?

読み込みのためにアーカイブを WebFrame に渡す前に、webarchive をデコードし、WebResourceURL エントリを見つけて削除する必要はありません。

これを機能させるには、WebView またはそのメイン フレームのいずれかで設定する必要があるものが他にあるのではないかと思います。

Xcode がこれらの Web アーカイブを問題なく表示できることに気付きました。これは、Xcode が問題を解決するより「適切な」方法で WebKit を使用していることを示唆しています。しかし、おそらくそれは、私のコードがCFDataオブジェクトからアーカイブをロードしている間に、NSWebFrameがディスクからアーカイブをロードしているためです.ファイルからロードするとき、WebKitはそのファイルURLをベースURLとして使用している可能性があります.使用可能な URL がまったく取得されない場合。


ここで Xcode の小さなデモ プロジェクトを作成しました: http://files.tempel.org/Various/Mail-WebArchive-Display-Issue.zip

メールからの元のアーカイブ (「mail-bad.webarchive」) と固定アーカイブ (「mail-good.webarchive」) の両方が含まれており、どちらもデモ アプリの 2 つの webView に表示されます。


また、Apple DTS で Tech Support 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 に答える