在Cocoa WebView中防止Flash

ilj*_*ing 6 flash cocoa webkit objective-c

在我的Cocoa应用程序中,我想阻止Flash加载到WebView中,并让用户决定是否应该为每个页面显示Flash.(这与通过ClickToFlash插件或Safari扩展程序已经提供的行为相同.由于许可问题,捆绑任何这些扩展可能不是一种选择.)

不幸的是,我试图避免使用的大部分Flash都是通过专门设计的嵌入式JavaScript生成的,以防止轻松阻塞,因此我无法过滤原始HTML以包含Flash对象.

此外,我无法为我的WebView禁用JavaScript,因为当我关闭JavaScript时,我要显示的页面看起来完全不同.

在执行JavaScript之后,但是在加载Flash插件之前,是否有可用于修改页面DOM的通知/挂钩?

或者我应该追求不同的方向?

谢谢,Ilja

Rob*_*ger 6

理想情况下,您只需定义自己的WebKit插件即可处理application/shockwave-flashMIME类型并使插件不执行任何操作.

但是,遗憾的是,没有办法控制所有注册相同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
Run Code Online (Sandbox Code Playgroud)

然后你只需要创建一个自定义的WebKit插件来处理"application/my-plugin-type"并让插件什么也不做.