资讯

精准传达 • 有效沟通

从品牌网站建设到网络营销策划,从策略到执行的一站式服务

ios开发oc调用js,ios开发语言swift和oc

如何在IOS平台上使用js直接调用OC方法

本例子是为了让大家能快速开发出OC调用JS功能的一个简单的例子。

目前创新互联公司已为成百上千家的企业提供了网站建设、域名、虚拟空间、网站运营、企业网站设计、张店网站维护等服务,公司将坚持客户导向、应用为本的策略,正道将秉承"和谐、参与、激情"的文化,与客户和合作伙伴齐心协力一起成长,共同发展。

1、准备一个本地化的html网页,如jsIOS.html

script type="text/javaScript"

function postStr(){

return document.getElementById("text1").value;

//return "javaScript返回值啦";

}

/script

2、将此html文件放到项目代码目录里面,如图:

3、拖一个UIWebView控件和UIButton控件到xxxViewController对应的.xib或.storyboard视图的UIView上;

在xxxViewController的.h文件中分别声明UIWebView类型变量和UIButton类型的变量,以及一个按钮点击事件(并且跟视图里面的控件连线),

并且添加一个UIWebViewDelegate类型的委托。喎�"" target="_blank" class="keylink"vcD4KPHA+eHh4Vmlld0NvbnRyb2xsZXIuaM7EvP7E2sjdyOfPwqO6PC9wPgo8cD48L3A+CjxwIGNsYXNzPQ=="p1"

#import

@interface ViewController : UIViewController

@property(nonatomic,retain) IBOutlet UIWebView *webview;

@property(nonatomic,retain) IBOutlet UIButton *button;

-(IBAction)IOS_JS:(id)sender;

@end

4、在xxxViewController.m文件中实现通过点击事件,调用javaScript的方法并取得返回值。

代码如下:

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize webview;

- (void)viewDidLoad

{

[super viewDidLoad];

//设置webView

webview.backgroundColor = [UIColor clearColor];

//webview.scalesPageToFit =YES;

webview.delegate =self;

//找到jsIOS.html文件的路径

NSString *basePath = [[NSBundle mainBundle]bundlePath];

NSString *helpHtmlPath = [basePath stringByAppendingPathComponent:@"jsIOS.html"];

NSURL *url = [NSURL fileURLWithPath:helpHtmlPath];

//加载本地html文件

[webview loadRequest:[NSURLRequest requestWithURL:url]];

}

/*

* 点击事件

* 调用javaScript的方法postStr()并取得返回值

* 输出返回值到控制台

*/

-(IBAction)IOS_JS:(id)sender

{

NSString *str = [self.webview stringByEvaluatingJavaScriptFromString:@"postStr();"];

NSLog(@"JS返回值:%@",str);

}

- (void)didReceiveMemoryWarning

{

[super didReceiveMemoryWarning];

}

@end

iOS APP与H5交互的三种方法

这种方法是利用拦截webView响应的url,对url进行处理,同时把需要执行的方法名和参数都放入url中,实现app和H5之前的方法交互:

这个属性是WKWebView才有的属性,主要是通过WKScriptMessageHandler的代理方法 - (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message 进行交互。

注意:

这两个方法是成对出现的,每次调用了add就必须调用remove。

1.建立 WebViewJavaScriptBridge 和 WebView 之间的关系。

_jsBridge = [WebViewJavascriptBridge bridgeForWebView:_webView];

2.方法调用

1)oc调js方法(通过data可以传值,通过 response可以接受js那边的返回值 )

2)js调oc方法(可以通过data给oc方法传值,使用responseCallback将值再返回给js)

最后:iOS调用H5方法

UIWebView: NSString *result = [webView stringByEvaluatingJavaScriptFromString:@"javascript:add(3,5);"];

WKWebView: [self.webView evaluateJavaScript:@"show()" completionHandler:^(id _Nullable response, NSError * _Nullable error) { //TODO }];

iOS - OC 与 JS 交互六种方式总结

在 APP 中,免不了与 H5页面打交道,所以掌握 与 JS 交互就显的至关重要,本文总结了常见的与 JS 交互方式。

注意事项

在 OC 原生中

在 html 文件中

早期的JS与原生交互的开源库很多都是用得这种方式来实现的,例如:PhoneGap、 WebViewJavascriptBridge 。

效果图

使用WKNavigationDelegate中的代理方法,拦截自定义的 URL 来实现 JS 调用 OC 方法。

注意点

关于如何区分执行不同的OC 方法,也与UIWebView的处理方式一样,通过URL 的host 来区分执行不同的方法:

JS 调用OC 方法后,有的操作可能需要将结果返回给JS。这时候就是OC 调用JS 方法的场景。

WKWebView 提供了一个新的方法 evaluateJavaScript:completionHandler: ,实现OC 调用JS 等场景。

注意点

运行结果

在iOS 7之后,apple添加了一个新的库JavaScriptCore,用来做JS交互,因此JS与原生OC交互也变得简单了许多。

首先导入JavaScriptCore库, 然后在OC中获取JS的上下文。

再然后定义好JS需要调用的方法,例如JS要调用share方法:

则可以在UIWebView加载url完成后,在其代理方法中添加要调用的share方法:

OC 调用 JS 方法有多种,首先介绍使用JavaScriptCore框架的方式。

使用JSContext 的方法 -evaluateScript ,可以实现 OC 调用 JS 方法

效果图

使用WKWebView的时候,如果想要实现JS调用OC方法,除了拦截URL之外,还有一种简单的方式。那就是利用WKWebView的新特性MessageHandler来实现JS调用原生方法。

创建 WKWebViewConfiguration 对象,配置各个API对应的MessageHandler。

然后在界面即将显示的时候添加MessageHandler

需要注意的是addScriptMessageHandler很容易引起循环引用,导致控制器无法被释放,所以需要移除MessageHandler

这里实现了两个协议 WKUIDelegate,WKScriptMessageHandler , WKUIDelegate 是因为我在JS中弹出了alert 。 WKScriptMessageHandler 是因为我们要处理JS调用OC方法的请求。

WKScriptMessage 有两个关键属性 name 和 body 。

因为我们给每一个OC 方法取了一个name,那么我们就可以根据name 来区分执行不同的方法。body 中存着JS 要给OC 传的参数。

关于参数body 的解析,我就举一个body中放字典的例子,其他的稍后可以看demo。

解析JS 调用OC 实现分享的参数:

message.boby 就是JS 里传过来的参数。我们不同的方法先做一下容错性判断。然后正常取值就可以了。

下面只列举一个shareClick()方法,其他看Demo

这里使用WKWebView 实现OC 调用JS方法与之前说的文章一样,通过

- evaluateJavaScript:completionHandler:

效果图如下图所示

详情看下面文章链接

iOS下 JS 与 OC 互相调用(五) - UIWebView+WebViewJavascriptBridge

详情看下面文章链接

iOS下 JS 与 OC 互相调用(六) - WKWebView+WKWebViewJavascriptBridge

iOS下 JS 与OC 互相调用(一) - UIWebView 拦截 URL

iOS下 JS 与OC 互相调用(二) - JavaScriptCore

iOS 下 JS 与 OC 互相调用(三) - WKWebView 拦截 URL

iOS下JS与OC互相调用(四)-MessageHandler

iOS下 JS 与 OC 互相调用(五) - UIWebView+WebViewJavascriptBridge

iOS下 JS 与 OC 互相调用(六) - WKWebView+WKWebViewJavascriptBridge

那些年趟过的OC与JS交互的坑

以前在项目中很少用到OC和JS交互,所以对这方面没有进行更加深入的了解,最近公司安排的一个项目;一半的内容是用h5写的;所以在这个过程中需要OC和JS进行无缝对接,互相频繁调用。在做的过程中出现了一些问题,这里总结出现,希望能给大家一些启示。

一.在webview中如果项目只是想简单用一下js和oc进行交互,就没有必要搞的那么麻烦,只需要用下面的方式进行处理就行.

1.oc调用js;例如,在js中有一个叫commit的方法,在oc中咱们可以这样来调用它

如果你调用的js函数需要传入参数,也不要紧,咱们只需要通过字符串拼接的方式将参数传入即可。比如当前有一个叫sum(a,b)的js函数,在oc中咱们可以这样来调用它---(注意:在内部参数要用' '来将参数括起来,这是因为html函数传参方式跟oc的不同,我们必须要按照html的传参方式传入才会有效果)

2.js调用oc;以前js调用oc是通过在webview这边拦截js那边触发的http请求的url地址来判断是不是我们需要调用的时机,然后再调用的oc。如果当我们在webview上点击一个按钮的时候他会跳转到这个页面,那么我们在oc这边就可以通过拦截这个地址做一些事情

二.其实,通过上面的方法是可以达到js和oc之间进行通讯,但是它也是存在一些弊端,或者说有时候不是很方便的。在ios7以后苹果官方将javascriptCore框架给开放出来了,我们这个通过这个框架就可以畅通无阻的让js和oc之间进行相互调用了。

1.通过javascriptCore来进行js和oc互相调用。第一步就是要进入javascriptCore这个框架.

之后就可以在需要使用的控制器中导入javascriptCore框架了,并且如果你需要js来调用oc,并且在js中的触发函数是native.submit(a,b)类型的,那么你需要将js方法和oc方法进行关联,这样处理以后,调用js对应的方法就会触发oc对应的方法,当然,JSContext对象也是必须的,这个对象是js和oc关联起来的工具,所有的js和oc调用都需要通过它来完成。

然后在webViewDidFinishLoad:中我们需要进行下面的步骤,关联native方法,是在当js方法中有native.submit()类型函数的时候才需要绑定的,如果没有这种类型的就不需要绑定。

注:其实通过上面的方法把self.context的native方法跟self绑定是会发生很严重的内存泄露问题的。因为这样会造成self被相互持有,导致该对象无法被释放,解决方案是native指定一个新的对象,然后在指定对象里实现JSExport协议。

接下来就是非native.submit()形式js触发函数调用oc的方式,我们这边可以用block形式关联javascript function.

通过上面的调用方式就可以获取到js调用时给oc传过来的参数,然后再进行相关处理.当js那边是native.类型的函数的时候,js调用oc,我们就可以直接拿到js跟oc绑定的那个方法来进行处理。

到此,js和oc之间相互调用的内容就差不多了,但是在使用的过程中有些情况下会发生莫名情况的野指针的情况 ,直接导致程序的崩溃。这个问题我是在webview中调用手机摄像头拍照上传的过程中发现的,具体流程是当需要上传图片的时候js调用oc的方法,然后oc进行拍照并且上传,当上传图片成功以后,再通过oc调用js通过js去回显图片,就是在回调js的过程中有时候就会发生莫名其妙的野指针崩溃,暂时我还没找到能够彻底解决这个问题的办法,等找到相关方法,我再进行公布。

续:之前在webView中频繁使用js和OC互相调用,出现了野指针问题,那么这个问题现在解决了。具体做法就是我们拿到webView所在的线程,让你要执行的方法在webView所在线程中执行。例如:

通过上述方法就可以避免野指针问题,但是具体是因为什么原因造成野指针问题的,我还没弄明白,希望知道的高手指教。

如何在ios平台上使用oc直接调用js方法

使用示例: 下面的示例代码将调用上面NativeOcClass的方法,在js层只需要这样调用: var ret = jsb.reflection.callStaticMethod("NativeOcClass", "callNativeUIWithTitle:andContent:", "cocos2d-js", "Yes! you call a Native UI from Reflect.


分享文章:ios开发oc调用js,ios开发语言swift和oc
URL链接:http://cdkjz.cn/article/dsisojp.html
多年建站经验

多一份参考,总有益处

联系快上网,免费获得专属《策划方案》及报价

咨询相关问题或预约面谈,可以通过以下方式与我们联系

大客户专线   成都:13518219792   座机:028-86922220