专栏首页DannyHoo的专栏iOS开发中OC与JS交互(UIWebView)

iOS开发中OC与JS交互(UIWebView)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53189934

之前虽然做过OC与JS交互,但都是比较简单的效果:点击网页中的图片,然后进行图片浏览。现在对OC与JS交互这块也不是很清楚,今天只是把之前的代码贴过来以便今后更好地理解OC与JS的交互。

首先需要往网页中注入JS。注入JS的工作是后台做的。可好像安卓和iOS还是有区别的,因为之前安卓那边可以实现与JS的交互,而我这边却不能。后台后台修改了代码,我这边也就可以进行交互了。

JS代码:

<html>

<head>

<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">

<scripttype="text/javascript">

var share = JSON.stringify({"title":"呵呵",

"desc":"哈哈",

"shareUrl":"http://www.baidu.com"

                                           });

function startFunction(share){

                                               window.android.startFunction(share)//android

                                           }

</script>

</head>

<body>

<br/>

<h1>Objective-C和JavaScript交互的那些事</h1><br/>

<input  type="button"value="Share"onClick="startFunction(share)" >点击调用原生代码并传递参数</a>

</body></html>

客户端代码:

self.webView = [[UIWebViewalloc]initWithFrame:self.view.bounds];

self.webView.delegate =self;

    [self.viewaddSubview:_webView];

NSString *str = [[NSBundlemainBundle]pathForResource:@"ExampleApp"ofType:@"html"];

    [self.webViewloadRequest:[NSURLRequestrequestWithURL:[NSURLfileURLWithPath:str]]];

- (void)webViewDidFinishLoad:(UIWebView *)webView{

_jsContext = [webViewvalueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

_jsContext[@"startFunction"] =^(id obj){

////这里通过block回调从而获得h5传来的json数据

/*block中捕获JSContexts

         我们知道block会默认强引用它所捕获的对象,如下代码所示,如果block中直接使用context也会造成循环引用,这使用我们最好采用[JSContext currentContext]来获取当前的JSContext:

         */

        [JSContextcurrentContext];

NSData *data = [(NSString *)objdataUsingEncoding:NSUTF8StringEncoding ];

NSDictionary *dict = [NSJSONSerializationJSONObjectWithData:dataoptions:NSJSONReadingMutableContainerserror:nil];

NSLog(@" data   %@   ======  ShareUrl %@",obj,dict[@"shareUrl"]);

    };

//

_jsContext.exceptionHandler = ^(JSContext *context,JSValue *exceptionValue) {

        context.exception = exceptionValue;

//比如把js中的方法名改掉,OC找不到相应方法,这里就会打印异常信息

NSLog(@"异常信息:%@", exceptionValue);

    };

}

苹果有了

<JavaScriptCore/JavaScriptCore.h>

这个库之后就可以使用JSContext这个类了。

补充:

之前底牌项目中的代码,实现点击图片显示图片的功能。

- (void)webViewDidFinishLoad:(UIWebView *)webView{

NSLog(@"加载完成...");

JSContext *context = [_webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

NSLog(@"%@", context);

    context[@"image_add_i"] = ^() {//通过block回调获得h5传来的数据

NSArray *args = [JSContextcurrentArguments];

// 数组中装数组

        [self.picsArrremoveAllObjects];

        [self.picsArraddObject:args];

    };

    context[@"image_show_i"] = ^() {

NSArray *args = [JSContextcurrentArguments];

//        NSLog(@"%@", args);

        for (JSValue *jsVal in args) {

//            NSLog(@"%@", jsVal);

_picIndex = jsVal;

// 展示图片

            [selfshowBigPic];

        }

JSValue *this = [JSContextcurrentThis];

NSLog(@"this: %@",this);

    };

}

在每次点击图片的时候都要掉用content[@"image_show_i"]...这段代码,这段代码的目的是获取当前点击图片的下标.

附上利用WKWebView加载网页OC与JS的交互的地址:

http://mp.blog.csdn.net/postedit/53541088

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 利用UIPanGestureRecognizer手势全屏侧滑返回

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • MJRefreshFooter明杰刷新控件结束加载显示“没有更多内容”

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • iOS中push与pop的随意切换

    版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/...

    用户1451823
  • Shiro系列 | 《Shiro开发详细教程》第三章:Shiro授权流程-下

    subject.checkPermissions("user:update");

    码神联盟
  • get_userdata——获取用户数据

    获取某个用户的用户数据,数据形式为一个 WP_User 对象,我们可以通过 “->” 操作符直接获取 wp_users 和 wp_usermeta 数据表里面的...

    赵帆同学GXUZF.COM
  • 观察者模式

    当对象之间有一对多关系我们会用到观察者模式。具体来说当多个对象依赖某个对象时,需要使用观察者模式。

    渔父歌
  • 终于搞定了困扰我多时(多月)的武术藏经阁创始人的问题了。

    用户1191760
  • 理解PHP中的stdClass类

    相信大家跟我一样,会经常看到和下面很类似的PHP代码: 复制代码 $user = new stdClass(); $user->name = 'gouki'; ...

    企鹅号小编
  • 登录缓慢的诡异问题

    最近有套测试库,出现了很诡异的现象,通过PLSQL Developer登录这套数据库(用户名:user_a)的时候异常的慢,几分钟才能连上,从现象来看,可能有很...

    bisal
  • SpringMVC response返回参数绑定

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    多凡

扫码关注云+社区

领取腾讯云代金券