1. 程式人生 > >在 Mac Webview 中 Objective-c 與 JS 互動

在 Mac Webview 中 Objective-c 與 JS 互動

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 表示函式被排除,不會在網頁上註冊
}