gpt4 book ai didi

objective-c - 在 Cocoa WebView 中防止 Flash

转载 作者:太空狗 更新时间:2023-10-30 03:43:15 24 4
gpt4 key购买 nike

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

不幸的是,我试图避免的大部分 Flash 都是从嵌入式 JavaScript 生成的,这些 JavaScript 专门设计用于防止 flash 容易被阻塞,因此我无法过滤原始 HTML 以包含 Flash 对象。

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

在执行 JavaScript 之后但在加载 Flash 插件之前,我可以使用通知/ Hook 来修改页面 DOM 吗?

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

谢谢,伊利亚

最佳答案

理想情况下,您只需定义自己的 WebKit 插件来处理 application/shockwave-flash MIME 类型,让您的插件什么也不做。

但是,不幸的是,没有办法控制所有注册相同 MIME 类型的多个 WebKit 插件的优先级。 WebKit 插件的加载顺序是完全随机和任意的,因此您不能保证您的插件会处理 Flash 对象而不是 Flash 插件。

我发现的解决这个问题的唯一方法是子类化 WebView 并覆盖私有(private)方法 -_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 插件来处理“application/my-plugin-type”并让该插件什么也不做。

关于objective-c - 在 Cocoa WebView 中防止 Flash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4885513/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com