JS交互(js调oc,oc调js,js,oc互调,第三方库WebViewJavascriptBridge)

1. WebView协议

1.1.将html网页加载进入UIWebView容器中 在"-(void)viewDidLoad”方法中加入如下代码

NSString*webPath=[[NSBundlemainBundle]pathForResource:@“HelloWord"ofType:@"html”];//获取文件路径

NSURL *webURL = [NSURLfileURLWithPath:webPath];//通过文件路径字符串设置URL

NSURLRequest *URLRequest =
[NSURLRequestrequestWithURL:webURL];//设置请求提交的相关URL

[self.webViewloadRequest:URLRequest];//提交请求

1.2.加入UIWebViewDelegate委托(如果想要进行相应的数据交互必须添加相应的我委托)

1.-(BOOL)webView:(UIWebView
*)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType//html页面的js动作触发时运行

     NSLog(@"request:%@",request.URL.absoluteString);//获取每个点击事件//!!!: 方法一


2.-(void)webViewDidFinishLoad:(UIWebView
*)webView //html加载完后触发

1.3.OC提交JS请求.运行JS方法

[self.webViewstringByEvaluatingJavaScriptFromString:@”方法名(%@)",参数]];

1.4.JS提交请求到OC

在-(BOOL)webView:(UIWebView*)webView
shouldStartLoadWithRequest:(NSURLRequest*)request
navigationType:(UIWebViewNavigationType)navigationType中添加如下代码:

NSString*requestString = [[requestURL]absoluteString];//获取请求的绝对路径.

NSArray*components =
[requestStringcomponentsSeparatedByString:@":”];//提交请求时候分割参数的分隔符

if ([componentscount]
>1 && [(NSString
*)[components objectAtIndex:0]isEqualToString:@"testapp"]) {

//过滤请求是否是我们需要的.不需要的请求不进入条件

if([(NSString
*)[components objectAtIndex:1]isEqualToString:@"change"]) 
{

//所要执行的操作

}

returnNO;

}

returnYES;

1.5.HTML中JS的写法.

1.接收请求的方法写法

functionfund(){

//操作

}

2.提交请求的方法写法

function sendCommand(cmd,param){

var url="testapp:"+cmd+":"+param;//组合请求字符串

document.location = url;//提交的请求

}

最后附上代码(传送阵): http://download.csdn.net/detail/fqcl992/6929375

注:另外网上有用到stringByEvaluatingJavaScriptFromString的特性 
详情参考:http://www.cnblogs.com/zhuqil/archive/2011/08/03/2126562.html

2 - 第三方库使用方法

著作权归作者所有。 商业转载请联系作者获得授权,非商业转载请注明出处。 作者:独奏 链接:https://www.zhihu.com/question/27730517/answer/37910968 来源:知乎

1. 放在controller比较好,一个bridge只用来控制一个webview和OC的交互,一般情况下一个viewcontroller对应一个webview。而且放在controller内也符合bridge的角色

 2. WebViewJavascriptBridge已经封装好了实现细节,你只需要通过block的方式调用就好了

 3.实际上WebViewJavascriptBridge会自动把数据转成相应的对象,比如会把OC的NSDictionary转成JS下的成员对象,会把JS的数组解析成OC的
NSArray,你只需要直接使用就好了,并不需要特定的解析~5.
要确定的话可以使用带有callback的方法来确定,比如OC给JS传数据oc代码如下:[_bridge
callHandler:@"testJavascriptHandler" data:data responseCallback:^(id
response) {
        NSLog(@"JS确定收到数据的回调: %@", response);  }]; JS的代码如下bridge.registerHandler('testJavascriptHandler',
function(data, responseCallback) {  // 收到OC的消息,这里进行业务处理     // ...  var
responseData = { 'data':'data value' }

    responseCallback(responseData)//这里可以直接callback到OC的responseCallback里面
}) 只要你在JS中处理完成业务后调用 responseCallback 了,在OC中就会通过 responseCallback
收到回调消息,从而确定执行完毕~另外,针对最后一个问题,其实webview的渲染是独立线程的,包括你运行的JS代码实际上都是异步的,所以不要用面向过程的思维来考虑代码是否执行完毕,一切都是通过callback来通信的,只要做到在需要的时候正确调用到相应的代码段就好了。更多用法其实你可以参考我的博文:http://honglu.me/2014/09/27/WebViewJavascriptBridge%E4%BD%BF%E7%94%A8/

代码github地址:https://github.com/marcuswestin/WebViewJavascriptBridge
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
是的,可以使用WebView中JavaScript与Android中Java方法。 想要实现这个功能,需要使用到Android中的WebView的addJavascriptInterface方法。这个方法可以将Java对象暴露给JavaScript代码,JavaScript代码就可以用这个对象的方法,实现Java与JavaScript的通。 具体步骤如下: 1. 在Java代码中创建一个类,这个类中包含需要暴露给JavaScript的方法。 2. 使用WebView的addJavascriptInterface方法将这个Java类对象暴露给JavaScript。 3. 在JavaScript代码中,使用window对象来访问这个Java对象,即可用其中的方法。 具体的实现可以参考下面的代码示例: Java代码: ```java public class WebAppInterface { Context mContext; /** Instantiate the interface and set the context */ WebAppInterface(Context c) { mContext = c; } /** Show a toast from the web page */ @JavascriptInterface public void showToast(String toast) { Toast.makeText(mContext, toast, Toast.LENGTH_SHORT).show(); } } ``` 在Activity中使用addJavascriptInterface方法将Java对象暴露给JavaScript: ```java WebView webView = (WebView) findViewById(R.id.webview); webView.addJavascriptInterface(new WebAppInterface(this), "Android"); ``` JavaScript代码中通过window对象访问Java对象: ```javascript function showToast() { Android.showToast("Hello World!"); } ``` 注意,addJavascriptInterface方法需要在主线程中用,否则可能会出现安全问题。另外,在使用JavaScript用Java方法时,需要添加@JavascriptInterface注解,以确保安全性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值