2010-02-18 25 views
13

Pencerelerde, "Shell.Explorer" ActiveX denetimi bir uygulamaya gömüldüğünde, web sayfasındaki komut dizilerinin barındırma uygulamasına çağırabileceği şekilde bir "dış" işleyici - IDispatch uygulayan nesnenin kaydedilmesi mümkündür. . Gömülü Webkit - komut dosyası geri bildirimleri nasıl?

<button onclick="window.external.Test('called from script code')">test</button> 

Şimdi ive Mac geliştirme taşındı ve benim kakao uygulamada gömülü WebKit çalışan benzer bir şey olsun diye düşündüm. Ancak, gerçekten betiklerin barındırma uygulamasına geri çağırmasına izin veren herhangi bir olanak yok gibi görünüyor.

Tek parça önerisi window.alert'u kancalamak ve uyarı dizesi olarak biçimlendirilmiş bir mesaj dizesini iletmek için komut dosyaları almaktı. Ayrıca, WebKit'in NPPVpluginScriptableNPObject kullanarak bir uygulama tarafından barındırılan NPAPI eklentisine yönlendirilip yönlendirilmediğini merak ediyorum.

Bir şey mi eksik? Bir Web Görüntülemesi barındırmak ve komut dosyalarının ana bilgisayarla etkileşime girmesine izin vermek gerçekten zor mu?

cevap

30

Çeşitli WebScripting protokolü yöntemlerini uygulamanız gerekir.

@interface WebController : NSObject 
{ 
    IBOutlet WebView* webView; 
} 

@end 

@implementation WebController 

//this returns a nice name for the method in the JavaScript environment 
+(NSString*)webScriptNameForSelector:(SEL)sel 
{ 
    if(sel == @selector(logJavaScriptString:)) 
     return @"log"; 
    return nil; 
} 

//this allows JavaScript to call the -logJavaScriptString: method 
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel 
{ 
    if(sel == @selector(logJavaScriptString:)) 
     return NO; 
    return YES; 
} 

//called when the nib objects are available, so do initial setup 
- (void)awakeFromNib 
{ 
    //set this class as the web view's frame load delegate 
    //we will then be notified when the scripting environment 
    //becomes available in the page 
    [webView setFrameLoadDelegate:self]; 

    //load a file called 'page.html' from the app bundle into the WebView 
    NSString* pagePath = [[NSBundle mainBundle] pathForResource:@"page" ofType:@"html"]; 
    NSURL* pageURL = [NSURL fileURLWithPath:pagePath]; 
    [[webView mainFrame] loadRequest:[NSURLRequest requestWithURL:pageURL]]; 
} 


//this is a simple log command 
- (void)logJavaScriptString:(NSString*) logText 
{ 
    NSLog(@"JavaScript: %@",logText); 
} 

//this is called as soon as the script environment is ready in the webview 
- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame 
{ 
    //add the controller to the script environment 
    //the "Cocoa" object will now be available to JavaScript 
    [windowScriptObject setValue:self forKey:@"Cocoa"]; 
} 

@end 

kontrolörünüze Bu kodu uyguladıktan sonra, artık JavaScript ortamından Cocoa.log('foo'); çağırabilir ve logJavaScriptString: yöntemi çağrılır: Burada temel bir örnektir.

+0

[webView mainFrame] loadData yapar: didClearWindowObject öğesinin:? [WebView setFrameLoadDelegate: self] var; kurulum ancak bir breakpoint denediğimde windowScriptObject ayarlamıyor. – Luke

+1

Ben bu şekilde çalışan var, ama nasıl bir işleyici (JS işlevi) Kakao, bir şey bir kakao oldu bir geri arama olarak çağırırsınız. Tabii ki 'WindowViewObject' öğesini 'WebView''den alabilirsiniz, ancak' 'Cocoa'' için hangi WebScriptObject' örneğinin ait olduğunu öğrenmenin bir yolu var mı? –

+0

Harika. Teşekkürler! ;-) –

İlgili konular