2011-02-03 15 views
6

W mojej aplikacji Cocoa chcę uniemożliwić ładowanie Flasha w WebView i pozwolić użytkownikowi zdecydować, czy Flash powinien być wyświetlany dla każdej strony. (To samo zachowanie jest już dostępne za pośrednictwem wtyczki ClickToFlash lub rozszerzenia Safari. Łączenie dowolnych rozszerzeń prawdopodobnie nie jest możliwe z powodu problemów z licencjonowaniem).Zapobieganie migotaniu w kakao WebView

Niestety większość Flasha, którego próbuję uniknąć, jest generowana z osadzonych JavaScript zaprojektowany specjalnie w celu zapobiegania łatwemu blokowaniu flashowania, więc nie mogę filtrować surowego kodu HTML w celu włączenia obiektów Flash.

Ponadto, nie mogę wyłączyć JavaScript dla mojego WebView, ponieważ strona, którą chcę wyświetlić, wygląda zupełnie inaczej, gdy JavaScript jest wyłączony.

Czy istnieje powiadomienie/informacja, które można użyć do modyfikacji strony DOM po uruchomieniu JavaScript, ale przed wczytaniem wtyczki Flash?

A może powinienem podążać w innym kierunku?

Dzięki, Ilja

Odpowiedz

2

Oto podobne pytanie, które mogą pomóc:

Suppress plugin loading in WebKit

+0

Przykro mi, zapomniałem ważnego punktu w moim wstępnym pytaniu: "W mojej aplikacji Cocoa chcę zapobiec ładowaniu Flasha w WebView, ** i pozwolić użytkownikowi zdecydować, czy Flash powinien być wyświetlany dla każdej strony **. " – iljawascoding

+0

Jedynym problemem jest to, że rozwiązanie zamieszczone jako odpowiedź na to pytanie nie działa dla typów MIME obsługiwanych przez wtyczki. –

+0

Och, przepraszam. Powinien być raczej komentarzem niż odpowiedzią. –

6

Idealnie byłoby po prostu zdefiniować własną wtyczkę w WebKit, który obsługuje application/shockwave-flash typu MIME i uczynić Twoja wtyczka nic nie robi.

Niestety nie ma sposobu, aby kontrolować priorytet wielu wtyczek WebKit, które rejestrują się w tym samym typie MIME. Kolejność ładowania wtyczek WebKit jest całkowicie losowa i arbitralna, więc nie można zagwarantować, że wtyczka będzie obsługiwać obiekt Flash zamiast wtyczki Flash.

Jedynym sposobem obejścia tego, że znalazłem się na podklasy WebView i zastąpić metodę prywatną -_pluginForMIMEType: tak:

@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 

Następnie wystarczy utworzyć niestandardowy WebKit plugin do obsługi „application/My -plugin-type "i niech ta wtyczka w ogóle nic nie robi.

+0

Dzięki za podpowiedź. Podążę za tym, ale mam wątpliwości, czy mogę uzyskać zatwierdzenie mojej aplikacji w sklepie Mac App Store, _pluginForMIMEType jest prawdopodobnie na czarnej liście Apple. – iljawascoding

+0

Jest to możliwe, chociaż spodziewałbym się, że recenzenci będą nieco łagodniejsi z WebKit, ponieważ jest to całkowicie otwarte źródło.Wiem, że kazano mi używać pewnych niepublikowanych/prywatnych metod przez pracowników Apple na liście mailingowej WebKit-SDK-Dev firmy Apple. Co ciekawe, [ten pytający] (http://stackoverflow.com/questions/4527905/how-do-i-enable-local-storage-in-my-webkit- based-application) twierdzi, że użył prywatnej metody WebKit i zatwierdzono aplikację. –

+0

Sam stosowałem to podejście i zostało wielokrotnie zatwierdzone przez firmę Apple. Wygląda na to, że używają innego standardu dla projektów open source, takich jak WebKit. – starkos

1

OK, doszliśmy do tego.

Ponieważ nie ma oficjalnego API, które pozwala aplikacji hosta wiedzieć, kiedy JavaScript skończył lub kontrolować, która wtyczka powinna się załadować, używamy teraz niestandardowego kodu JavaScript, który zostanie wstawiony do otrzymanego kodu HTML, który chcemy wyświetlić.

Rozszerzenie ClickToFlash Safari (a nie wtyczka internetowa, na której się opiera) było dobrą inspiracją.

Powiązane problemy