在 Mac Webview 中 Objective-c 與 JS 互動
阿新 • • 發佈:2019-02-06
http://blog.eqoe.cn/posts/mac-webview-js-oc.html
本文為您圖文演示如何在 OC 中註冊或執行 JS 函式,以實現網頁與程式的互動。
1. 首先我們建立一個 XCode 專案;
2. 新增WebView 到ViewController中,
3. 在ViewController.h中申明webview成員變數,並建立關聯。
@interface ViewController : NSViewController
{
IBOutlet WebView* webView;
}
4. 在ViewController.mm中進行實現
#import "ViewController.h" @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. } - (void)setRepresentedObject:(id)representedObject { [super setRepresentedObject:representedObject]; // Update the view, if already loaded. } +(NSString*)webScriptNameForSelector:(SEL)sel { if(sel == @selector(Writelog:)) //JS對應的本地函式 return @"log"; // 要註冊的JS函式名 else if(sel == @selector(alert:)) return @"alert"; return nil; } + (BOOL)isSelectorExcludedFromWebScript:(SEL)sel { if(sel == @selector(Writelog:))//JS對應的本地函式 return NO; else if(sel == @selector(alert:)) return NO; return YES; //返回 YES 表示函式被排除,不會在網頁上註冊 } - (void)awakeFromNib //當 WebContoller 載入完成後執行的動作 { [webView setFrameLoadDelegate:self]; [[webView mainFrame] loadHTMLString:@"<button onclick=\"window.external.alert('This is an alert!!');\">Alert</button> <button onclick=\"window.external.log('lllllaaaa');\">Log</button>" baseURL:nil]; //網頁內容,兩個按鈕 一個彈出訊息框,一個在控制檯 Log // webView.mainFrameURL = @"http://someurl"; 載入網頁 } - (void)Writelog:(NSString*) txt { NSLog(@"Log:%@",txt); } - (void)alert:(NSString*) txt { NSAlert *alert = [[NSAlert alloc] init]; [alert setAlertStyle:NSInformationalAlertStyle]; [alert setMessageText:@"來自網頁的訊息"]; [alert setInformativeText:txt]; [alert runModal]; } - (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame //網頁載入完成後發生的動作 { [windowScriptObject setValue:self forKeyPath:@"window.external"]; // 註冊一個 window.external 的 Javascript 類 } @end
5. 新增庫
依賴,WebKit.framework
6. 程式碼說明
(A)
- (void)webView:(WebView *)sender didClearWindowObject:(WebScriptObject *)windowScriptObject forFrame:(WebFrame *)frame //網頁載入完成後發生的動作
{
[windowScriptObject setValue:self forKeyPath:@"window.external"]; // 註冊一個 window.external 的 Javascript 類
}
"window.external"為Javascript的類,函式有:“window.external.alert()” 和 “window.external.log()”,所以需要在下面B,和C中說明;
(B) js函式名和本地函式進行對映;
+(NSString*)webScriptNameForSelector:(SEL)sel
{
if(sel == @selector(Writelog:)) //JS對應的本地函式
return @"log"; // 要註冊的JS函式名
else if(sel == @selector(alert:))
return @"alert";
return nil;
}
(C) 將本地函式,註冊到網頁中;
+ (BOOL)isSelectorExcludedFromWebScript:(SEL)sel { if(sel == @selector(Writelog:))//JS對應的本地函式 return NO; else if(sel == @selector(alert:)) return NO; return YES; //返回 YES 表示函式被排除,不會在網頁上註冊 }