2011-02-03 29 views
6

Trong ứng dụng Cocoa của tôi, tôi muốn ngăn Flash tải trong WebView và cho phép người dùng quyết định xem Flash có được hiển thị cho mỗi trang hay không. (Đó là hành vi tương tự đã có sẵn thông qua plugin ClickToFlash hoặc tiện ích mở rộng Safari. Kết hợp bất kỳ tiện ích mở rộng nào trong số đó có thể không phải là một tùy chọn do vấn đề cấp phép.)Ngăn Flash trong Cocoa WebView

Thật không may, hầu hết Flash tôi đang cố gắng tránh được tạo từ nhúng JavaScript được thiết kế đặc biệt để ngăn chặn việc chặn flash dễ dàng, vì vậy tôi không thể lọc HTML thô để bao gồm các đối tượng Flash.

Ngoài ra, tôi không thể tắt JavaScript cho WebView của mình, vì trang tôi muốn hiển thị trông hoàn toàn khác khi JavaScript bị tắt.

Có thông báo/móc tôi có thể sử dụng để sửa đổi DOM trang sau khi JavaScript đã được thực thi hay không, nhưng trước khi plugin Flash được tải?

Hoặc tôi có nên theo một hướng khác không?

Cảm ơn, Ilja

Trả lời

2

Đây là một câu hỏi tương tự có thể giúp:

Suppress plugin loading in WebKit

+0

Tôi xin lỗi, quên một điểm quan trọng trong câu hỏi ban đầu của tôi: "Trong ứng dụng Cocoa của tôi, tôi muốn ngăn Flash tải trong WebView, ** và cho phép người dùng quyết định xem Flash có được hiển thị cho mỗi trang hay không **. " – iljawascoding

+0

Vấn đề duy nhất là giải pháp được đăng khi câu trả lời cho câu hỏi đó không hoạt động đối với các loại MIME được xử lý bởi các plugin. –

+0

Ồ, xin lỗi. Nên đã làm cho nó một bình luận chứ không phải là một câu trả lời. –

6

Tốt nhất, bạn sẽ chỉ xác định plug-in WebKit của riêng bạn mà xử lý các loại MIME application/shockwave-flash và làm trình cắm của bạn không làm gì cả.

Tuy nhiên, rất tiếc, không có cách nào để kiểm soát mức độ ưu tiên của nhiều trình cắm WebKit mà tất cả đều đăng ký cho cùng một loại MIME. Thứ tự tải của các trình cắm thêm WebKit hoàn toàn ngẫu nhiên và tùy ý, do đó bạn không thể đảm bảo rằng trình cắm của bạn sẽ xử lý đối tượng Flash thay vì plugin Flash.

Cách duy nhất xung quanh này mà tôi đã tìm thấy là để phân lớp WebView và ghi đè lên các phương pháp riêng -_pluginForMIMEType: như vậy:

@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 

Sau đó, bạn chỉ cần tạo một plugin tùy chỉnh WebKit để xử lý "application/của tôi -plugin-type "và có plug-in không làm gì cả.

+0

Cảm ơn gợi ý. Tôi sẽ làm theo nó, nhưng tôi có nghi ngờ rằng tôi sẽ nhận được ứng dụng của tôi được chấp thuận trong Mac App Store, _pluginForMIMEType có lẽ nằm trong danh sách đen của Apple. – iljawascoding

+0

Có thể, mặc dù tôi hy vọng những người đánh giá trở nên khoan dung hơn một chút với WebKit vì nó hoàn toàn là nguồn mở.Tôi biết rằng tôi đã được yêu cầu cụ thể sử dụng một số phương pháp chưa được công bố/riêng tư của nhân viên Apple trên danh sách gửi thư của WebKit-SDK-Dev của Apple. Điều thú vị là người yêu cầu [this questioner] (http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit-based-application) đã sử dụng phương thức WebKit riêng và đã có một ứng dụng được phê duyệt. –

+0

Tôi đã sử dụng chính phương pháp này và đã được Apple phê duyệt nhiều lần. Họ dường như sử dụng một tiêu chuẩn khác cho các dự án nguồn mở như WebKit. – starkos

1

Được rồi, chúng tôi đã tìm ra điều này.

Vì không có API chính thức cho phép ứng dụng máy chủ biết khi JavaScript hoàn thành hoặc kiểm soát plugin nào nên tải, chúng tôi hiện đang sử dụng JavaScript tùy chỉnh được chèn vào HTML nhận được mà chúng tôi muốn hiển thị.

Tiện ích mở rộng ClickToFlash Safari (không phải plugin Internet, dựa trên đó) là một nguồn cảm hứng tốt.

Các vấn đề liên quan