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

    首先我们创建一个 XCode 项目

    将 Webview 拖入 View Controller 中

    打开 ViewController.h 新建一个 WebController Interface 继承 NSObject

     #import <WebKit/WebKit.h>
    
     @interface WebController : NSObject
    {
        IBOutlet WebView* webView;
    }
    @end
    

    在项目中添加 Webkit.framework 的引用

    将一个 Object 拖拽至 ViewController 并填写其 Class 属性为 WebController

    右键点击 WebController 并将 webView 关联起来

    接下来就是关键代码 实现 WebController

    @implementation WebController
    
    +(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
    

    然后点击运行按钮 出现应用主界面并自动加载网页内容,此时我们点击 Log 就会在控制台输出数据,点击 Alert 按钮就会弹出提示框。