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 οnclick=\"window.external.alert('This is an alert!!');\">Alert</button> <button οnclick=\"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 表示函数被排除,不会在网页上注册
}