iOS JS 交互之利用系统JSContext实现 JS调用OC方法以及Objective-C调用JavaScript方法_weixin_34117522的博客-程序员秘密

技术标签: ViewUI  移动开发  javascript  

 ios js 交互分为两块:

1.oc调用js 

这一块实现起来比较简单,

我的项目中加载的是本地的html,js,css,需要注意的是当你向工程中拖入这些文件时,选择拷贝到工程中,(拖入的文件夹是蓝色的,相对路径),不然css,js 的路径会存在问题

 

加载本地html:

 

oc调用js:一句代码搞定

 

 

2.js 调用oc

  js调用oc又分为两种:

 1.js端是直接调用方法

这里就要说到ios7才推出的一个新的api    JavaScriptCore,首先我们引入这个类,并初始化一个JSContext对象

 

在webViewDidFinishLoad方法里

此处通过当前webView的键获取到jscontext

 

将我们的context对象与js方法建立桥接联系,

 

2.js端通过对象调用方法

说到对象调方法我们首先肯定得有个对象,所以我们首先需要创建一个js交互类,并声明和实现相应的交互方法,在这里需要注意的是我们需要在这个自定义交互类里面导入JavaScriptCore框架,声明一个遵从于JSExport协议的协议(有点绕,看图),在这个协议里声明我们的交互方法,最后让我们的交互类遵从与我们自定义的协议

 

在交互类的.m中实现相应的js交互方法,并实现我们想要的操作

注意到图上的

JSExportAs(invoke, - (void) invoke:(NSString *) method args:(NSString *) args);

 这个方法没有,这个方法的作用是当js端的方法有两个或两个以上参数时,我们需要让- (void) invoke:(NSString *) method args:(NSString *) args;这个方法代替 对应的js这个方法,因为oc端的方法名必须和js端的保持一致,不然就不会调用

最后在我们的webViewDidFinishLoad方法里初始化我们的交互对象,并让 context 与之建立联系,ok,完事

hybridApi调用此方法 -->

 

 

3. Objective-C调用JavaScript方法代码如下:

[self.webView evaluateJavaScript:[NSString stringWithFormat:@"__YutaAppOnPrepare()"]

                   completionHandler:^(id response, NSError *error)

     {

 

     }];

 ------分割线-----

如果项目中使用wkWebview, 那么不支持使用jsContext来进行js交互拦截js方法,不过可以使用一下方法:

 

#pragma -mark WKWebview的配置项

- (WKWebView *)wbview

{

    if (!_wbview) {

        config = [[WKWebViewConfiguration alloc]init];

        //注册js方法

        config.userContentController = [[WKUserContentController alloc]init];

        //webViewAppShare这个需保持跟服务器端的一致,服务器端通过这个name发消息,客户端这边回调接收消息,从而做相关的处理

        [config.userContentController addScriptMessageHandler:self name:@"webViewAppShare"];

        

        _wbview = [[WKWebView alloc]initWithFrame:WbviewFrame configuration: config];

        _wbview.navigationDelegate = self;

        _wbview.UIDelegate = self;

        

        [self.view addSubview:_wbview];

    }

    

    return _wbview;

}

 

//js交互方法

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message

{

    NSDictionary *msgBody = [[NSDictionary alloc] initWithDictionary:message.body];

    NSString * shareTitle = text_share;

    NSString * shareText = text_share;

    NSString * shareUrl = url_share;

}

 

 

 

 
 

 

转载于:https://www.cnblogs.com/jgCho/p/7049374.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34117522/article/details/93844924

智能推荐

深入理解JavaScript prototype原型_qx1995318的博客-程序员秘密

原文地址:点击打开链接函数也是一种对象。他也是属性的集合,你也可以对函数进行自定义属性。不用等咱们去试验,javascript自己就先做了表率,人家就默认的给函数一个属性——prototype。对,每个函数都有一个属性叫做prototype。这个prototype的属性值是一个对象(属性的集合,再次强调!),默认的只有一个叫做constructor的属性,指向这个函数本身。

解决:Invalid bound statement (not found)_胡金水的博客-程序员秘密

解决:Invalid bound statement (not found)解决方案:1.Mapper.java接口和Mapper.xml的id是否一致;2.Mapper.java接口和Mapper.xml的namespace是否一致;3.去除xml文件中的中文注释;4.配置问题,是否将application.yml中mybatis-plus配置成mybatisapplication.yml# mybatis 配置mybatis-plus: type-aliases-package: c

抖音直播伴侣和快手直播伴侣如何实现无人直播还能防封号_icfan000的博客-程序员秘密

众所周知抖音直播伴侣和快手直播伴侣是官方出的用于电脑端直播的软件,但是如果播放视频是会被封号的。那么怎么才能既能直播又不会被封号呢。 这里介绍一种方法,通过模拟摄像头的方式来直播,也就是将视频流转成摄像头数据,让系统识别为是一个摄像头设备。基本思路:USB UAC+UVC+U盘播放器。 可以选择linux系统的盒子来播放U盘内视频,然后软件将另一路USB接口模拟成UVC设备(USB Video Class)+UAC(USB Audio Class),说通俗点就是类似带麦克风的USB 摄...

css基础-文字排版、段落排版_-安小喵的博客-程序员秘密

ps:处理前段文本溢出,多余内容显示点点一.文字排版--字体我们可以使用CSS样式为网页中的文字设置字体,字号,颜色等样式属性。这里注意不要设置不常用的字体,因为如果用户本电脑上如果没有安装你设置的字体,就会显示浏览器默认的字体。(因为用户是否可以看到你设置的字体样式取决于用户本地电脑上是否安装你设置的字体.)现在一般网页喜欢设置“微软雅黑”.body{font-family:"Microsoft...

ES6学习笔记_es6最大的亮点_RheaWang的博客-程序员秘密

1. let 与var区别不同之处: —- let变量所在的代码块内有效,而var没有块级作用域的概念,只有全局变量和局部变量的概念; —- let声明的变量不存在变量提升,未声明变量使用变量会报错,var 声明的变量存在变量提升; —- let存在暂时性死区;暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量

2018牛客网暑假ACM多校训练赛(第六场)A Singing Contest 两两比赛问最终胜者的递归_最终胜者编程题_Code92007的博客-程序员秘密

题目传送门:https://www.nowcoder.com/acm/contest/144/A题意:2^n个歌手,每个歌手可以从自己的n首歌里选一首,每首歌对应一个评分,但选过的不能再选。现在1号和2号,3号和4号……2^n-1和2^n比赛。淘汰赛,输一局即被淘汰。赢者再两两比赛,问最终胜者。题解:贪心+递归+STL①我们只需在自己比对方最大的数还大的数里面,选择里面最小...

随便推点

【人脸检测】OpenCV中的Haar+Adaboost级联分类器分解(二):积分图和45°旋转积分图_荪荪的博客-程序员秘密

进前一篇文章分析了Haar特征,即通过“平移+放大”能够产生一系列数量巨大的Haar子特征,同时给出了Haar特征值计算公式。那么这就有一个问题:如何快速的计算出图像任意位置的某个Haar特征值?这就需要用到本节介绍的积分图。-------------------------------------------缩进以OpenCV自带的人脸分类器haarcascade_front

java正则表达式的减号_JAVA正则表达式_我不取名的博客-程序员秘密

一、行定位符(^和$)行定位符就是用来描述字串的边界。“^”表示行的开始;“$”表示行的结尾。如:^tm :该表达式表示要匹配字串tm的开始位置是行头,如tmequalTomorrowMoon就可以匹配tm$ :该表达式表示要匹配字串tm的位置是行尾,Tomorrow Moon equal tm匹配。如果要匹配的字串可以出现在字符串的任意部分,那么可以直接 写成 :tm二、单词定界符...

gpu并行化python程序,Python基于pyCUDA实现GPU加速并行计算功能入门教程_SeaTable的博客-程序员秘密

此文实例介绍了Python基于pyCUDA实现GPU加速并行计算功能。推荐给大伙学习一下,内容如下:Nvidia的CUDA 架构为我们提供了一种便捷的方式来直接操纵GPU 并进行编程,但是基于 C语言的CUDA实现较为复杂,开发周期较长。而python 作为一门广泛使用的语言,具有 简单易学、语法简单、开发迅速等优点。作为第四种CUDA支持语言,相信python一定会 在高性能计算上有杰出的贡献C...

pandas 学习汇总3 - Series,DataFrame迭代iter( tcy)_tcy23456的博客-程序员秘密

迭代iter 2018/12/1 =======================================================================1.基本iteration()产生:#系列:值;DataFrame:列标签;面板:项目标签# 迭代Series类似数组,迭代产生值。其他数据结构如DataFrame遵循迭代对象“键”的类似dict ...

(四)分数阶微积分_weixin_34321753的博客-程序员秘密

我们重点考察$R-L$型分数阶微积分的性质,简记${}_{0}^{RL}D_{t}^{\beta}=D_{t}^{\beta}$,若无特殊说明。a). 线性性$$D_{t}^{\beta}[f(t)+g(t)]=D_{t}^{\beta}f(t)+D_{t}^{\beta}g(t)$$$$D_{t}^{\beta}\lambda f(t)=\lambda D_{t}^{\beta}f(t) $$证...

推荐文章

热门文章

相关标签