2011-02-03 9 views
6

私のCocoaアプリケーションでは、WebViewでFlashを読み込まないようにし、各ページにFlashを表示するかどうかをユーザーに決定させたいと考えています。 (これは既にClickToFlashプラグインやSafari拡張機能で利用可能な同じ動作です。ライセンスの問題のため、これらの拡張機能のバンドルはおそらくオプションではありません)。Cocoa WebViewでのFlashの防止

残念ながら、避けようとしているほとんどのFlashは、 Flashは簡単にブロックされないように特別に設計されたJavaScriptなので、Flashオブジェクトを含めるために生のHTMLをフィルタリングすることはできません。

JavaScriptを無効にすると、表示したいページが完全に異なるように見えるため、WebViewのJavaScriptを無効にすることはできません。

JavaScriptが実行された後、Flashプラグインが読み込まれる前にページDOMを変更するための通知/フックはありますか?

私は別の方向を追うべきですか?ここで

おかげで、 は、Ilja

答えて

2

を助けるかもしれない同様の質問です:理想的

Suppress plugin loading in WebKit

+0

私の最初の質問では、重要な点を忘れていました。「私のCocoaアプリケーションでは、FlashがWebViewで読み込まれないようにしたいです。**、各ページにFlashを表示するか**。 " – iljawascoding

+0

唯一の問題は、プラグインによって処理されるMIMEタイプに対して、その質問への回答として投稿された解決策が機能しないことです。 –

+0

ああ、申し訳ありません。それは答えではなくコメントでなければならない。 –

6

、あなたは自分自身のWebKitのプラグインで、application/shockwave-flash MIMEタイプを扱う定義し、なるだろうあなたのプラグインは何もしません。

しかし、残念ながら、すべて同じMIMEタイプを登録する複数のWebKitプラグインの優先度を制御する方法はありません。 WebKitプラグインの読み込み順序は完全にランダムで任意です。したがって、プラグインがFlashプラグインではなくFlashオブジェクトを処理するとは限りません。

私が見つけたこれを回避する唯一の方法は、WebViewのサブクラスを作成し、そのようなプライベートメソッド-_pluginForMIMEType:をオーバーライドすることである。

@class WebBasePluginPackage; 

@interface WebView (MyFlashPluginHack) 
- (WebBasePluginPackage *)_pluginForMIMEType:(NSString *)MIMEType; 
@end 

@implementation MyWebView 

- (WebBasePluginPackage *)_pluginForMIMEType:(NSString *)MIMEType 
{ 
    if ([MIMEType isEqualToString:@"application/x-shockwave-flash"]) 
    { 
     return [super _pluginForMIMEType:@"application/my-plugin-type"]; 
    } 
     else 
    { 
     return [super _pluginForMIMEType:MIMEType]; 
    } 
} 

@end 

次に、あなただけの「アプリケーション/私を処理するためにカスタムWebKitのプラグインを作成する必要があります-plugin-type "とし、そのプラグインには何もしません。

+0

ヒントをありがとう。私はそれに従うだろうが、私はMac App Storeで私のアプリが承認されることに疑問を抱いている。_pluginForMIMETypeは恐らくAppleのブラックリストに載っているだろう。 – iljawascoding

+0

完全にオープンソースなので、査読者はWebKitにもっと寛大であると期待していますが、可能です。アップル社のWebKit-SDK-Devメーリングリストで未公開/非公開の方法をAppleの従業員が使用するよう具体的に言われたことは分かっています。興味深いことに、[この質問者](http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application)は、プライベートWebKitメソッドを使用していると主張しています。承認されたアプリを持っていた –

+0

私はこのアプローチを自分で使いました。これはAppleによって何度も承認されています。彼らはWebKitのようなオープンソースプロジェクトのために異なる標準を使用しているようです。 – starkos

1

さて、私たちはこれをかなり考え出しました。

JavaScriptが終了したときにホストアプリケーションに通知する公式APIがないため、読み込むプラグインを制御することができないため、表示する受信したHTMLにカスタムJavaScriptを挿入しています。

ClickToFlash Safari拡張機能(Internet Pluginではなく)が優れたインスピレーションをもたらしました。

関連する問題