永发信息网

iOS开发 怎么实现js调取oc中的方法

答案:1  悬赏:20  手机版
解决时间 2021-01-24 13:28
iOS开发 怎么实现js调取oc中的方法
最佳答案
我们要做的有如下几件事情:

首先:通过webview加载一个本地html文件
[self.myWebView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"html"]isDirectory:NO]]];
其次:我们要在我们的OC代码里面注册JS方法

- (void)h5callApp

{

//获取该UIWebview的javascript执行环境。

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

context.exceptionHandler = ^(JSContext *con, JSValue *exception) {

NSLog(@"%@", exception);

con.exception = exception;

};

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

NSLog(@"+++++++Begin Log+++++++");

NSArray *args = [JSContext currentArguments];

for (JSValue *jsVal in args) {

NSLog(@"%@", jsVal);

}

JSValue *this = [JSContext currentThis];

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

NSLog(@"-------End Log-------");

};

}

要保证本地的html里面有h5CallApp这个方法哦。
这就是刚刚上述博客里面提到的方法,是不是看上次很简单的样子。
But
我运用到我们项目里面的时候,死活不能调用该方法,why?我厚着脸皮问了我们的帅哥安卓开发,得知他们里面有这一样一行代码
webView.addJavascriptInterface(new JSInvoke(), "test");
看上去第一眼的感觉是不是累似注册了一个东西,可是我找了好多博客我没有找到我们IOS类似的啊,着急啊着急。
意外的意外,伟大的github上面就是资源多,我在上面找到一个EasyJSWebViewSample这样一个开源项目,里面有一句

MyJSInterface* interface = [MyJSInterface new];

[self.myWebView addJavascriptInterfaces:interface WithName:@"MyJSTest"];

是不是感觉和安卓里面的那个注册类似的,没错,太开心了。
最后的最后,你以为结束了,NO!
该Demo里面的html有空的小朋友可以看一下。
由于项目需求我们是3个参数,在该demo里面执行拿到第一个参数,该demo就运行出错,提示我们数组越界了,在这里真的浪费了好多时间,后来发现他们的demo里面调用两个参数的方法在JS里面声明的方法与OC里面真正的实现方法有点差入,比如OC里面定义的方法
- (void) h5CallApp: (NSString*) param And2: (NSString*) param2 And3: (NSString*) param3
在html里面只能写成
MyJSTest.h5CallAppAnd2And3("param1","param2","param3")。
是不是觉得不可思义,最后我整体看了一下代码,里面好像有这一段在注入JS的时候有用到的

inject: function (obj, methods){\\

window[obj] = {};\\

var jsObj = window[obj];\\

\\

for (var i = 0, l = methods.length; i < l; i++){\\

(function (){\\

var method = methods[i];\\

var jsMethod = method.replace(new RegExp(\\":\\", \\"g\\"), \\"\\");\\

jsObj[jsMethod] = function (){\\

return EasyJS.call(obj, method, Array.prototype.slice.call(arguments));\\

};\\

})();\\

}\\

}

这个好像是替换方法的,原谅我的无知啊,我也是没看懂,仅仅是感觉与猜测,勿喷我,我真的怕被喷。
最后的最后,JS的那边的开发肯定是不会为了将IOS与安卓开发做区分写代码的,所以我只能在注入JS完成后加了这么一句
[webView stringByEvaluatingJavaScriptFromString:@"test.h5CallApp=test.h5CallAppAnd2And3;"]
这句话的作用是替换JS里面的方法的。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
米沟村怎么去啊,我要去那办事
爱丽丝美发地址好找么,我有些事要过去
怎么更改大白菜PE的背景图片
月亮星座计算
以下主张明显体现春秋战国时期儒家思想主张的
【主要工作业绩】个人主要工作业绩怎么写
CAN总线的通讯协议是什么?
amd新驱动降频 有人和我一样情况吗r9 390
学习生物知识时,如果用流程图将连续发生的一
陈翔所在的天娱传媒有限公司在北京的具体位置
第二次工业革命引起资本主义对生产关系的调整
卷槽村地址在哪,我要去那里办事
288造型地址好找么,我有些事要过去
从德胜门外怎么去北京的京深海鲜市场,地铁的
6(7+1)(7^2+1)(7^4+1)(7^8+1)+1
推荐资讯
yy对方把我拉入黑名单怎么才可以发消息给对方
海马s5,一公里油耗多少钱
【我素不知道天下有这许多新鲜事】.“我素不
万意商城地址在什么地方,我要处理点事
求一部电影,剧情差不多是几个人最开始被人嘲
联邦进口税怎么算
怎么计算44.1/12:8.82/1:47.08/
我CSOL号被盗了怎么办,忘记安全码了
通风区优秀个人先进事迹范文
最新特色小吃加盟店是啥?
在三角形ABC中,cosB=-5/13,cosC=4/5.设三角
在中国可以买宠物豹么?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?