在 Mac Webview 中 Objective-c 与 JS 交互

http://blog.eqoe.cn/posts/mac-webview-js-oc.html


本文为您图文演示如何在 OC 中注册或运行 JS 函数,以实现网页与程序的交互。

1. 首先我们创建一个 XCode 项目;

2. 添加WebView 到ViewController中,

在 Mac Webview 中 Objective-c 与 JS 交互_第1张图片

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:@" " 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

在 Mac Webview 中 Objective-c 与 JS 交互_第2张图片


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 表示函数被排除,不会在网页上注册
}


你可能感兴趣的:(Cocoa)