美文网首页
UIWebView:JS调用OC

UIWebView:JS调用OC

作者: xiari1991 | 来源:发表于2017-05-25 19:14 被阅读71次

一:Custom URL Scheme(拦截URL)

<a href="darkangel://smsLogin?username=12323123&code=892845">短信验证登录</a>

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    //标准的URL包含scheme、host、port、path、query、fragment等
    NSURL *URL = request.URL;    
    if ([URL.scheme isEqualToString:@"darkangel"]) {
        if ([URL.host isEqualToString:@"smsLogin"]) {
            NSLog(@"短信验证码登录,参数为 %@", URL.query);
            return NO;
        }
    }
    return YES;
}

二:JavaScriptCore

<a href="javascript:void(0);" class="sharebtn" onclick="share('分享标题', 'http://cc.cocimg.com/api/uploads/170425/b2d6e7ea5b3172e6c39120b7bfd662fb.jpg', location.href)">分享活动,领30元红包</a>

比如js中我定义了一个分享的方法

function share(title, imgUrl, link) {
     //这里需要OC实现
}

在OC中实现如下

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    //将js的function映射到OC的方法
    [self convertJSFunctionsToOCMethods];
}

- (void)convertJSFunctionsToOCMethods
{
    //获取该UIWebview的javascript上下文
    //self持有jsContext
    //@property (nonatomic, strong) JSContext *jsContext;
    self.jsContext = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    //js调用oc
    //其中share就是js的方法名称,赋给是一个block 里面是oc代码
    //此方法最终将打印出所有接收到的参数,js参数是不固定的
    self.jsContext[@"share"] = ^() {
        NSArray *args = [JSContext currentArguments];//获取到share里的所有参数
        //args中的元素是JSValue,需要转成OC的对象
        NSMutableArray *messages = [NSMutableArray array];
        for (JSValue *obj in args) {
            [messages addObject:[obj toObject]];
        }
        NSLog(@"点击分享js传回的参数:\n%@", messages);
    };
}

相关文章

网友评论

      本文标题:UIWebView:JS调用OC

      本文链接:https://www.haomeiwen.com/subject/xcvzxxtx.html