交互办法:
方案一.使用系统的最原生的交互:
(1)js 调用原生的方法:
思路:网页的每次请求都是一次request ,在webView中有一个代理方法- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;可以拦截请求的东西。
本人对js了解不太深所以js代码就不贴了。算了还是找到了贴一下,
#pragma mark ****这部分代码是html中的 js代码
var btn = document.getElementById('upload'); // 获取叫upload的按钮
var nativeBridage = { // 这个应该是和webView的桥梁吧,不太懂的样子。
invoke: function (commandName) {
console.log(commandName);
window.location = 'js-call:' + commandName ;// 这js-call 是我们能够截获到的事件嗯,就是他了。
}
};
btn.addEventListener("click", function() {// 这个是为按钮增加绑定点击事件
console.log("Cliked");// 打印。。。
if (window.android) { // 这个是安卓的方法,安卓的方法好像能直接调用,好厉害的样子
console.log("Has Android");
android.test();
} else {// 这个代码就是我们iOS的了,不是安卓就是iOS,你把winPhone放哪了?别问我也不知道。
nativeBridage.invoke('test');
}
});
#pragma mark ****这部分代码是我们OC中的代码了
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
//获取他的请求路径
NSString *requestURLString = [[request URL] absoluteString];
// 判断是否有这个js-call
if ([requestURLString hasPrefix:@"js-call:"]) {
// 接下来是判断command的名字和JSON参数字符串:
#warning js-call 后面是个数组,
NSArray *components = [requestURLString componentsSeparatedByString:@":"];
// 命令名字
NSString *commandName = (NSString*)[components objectAtIndex:0];
NSLog(@"components %@ %@ ",components,commandName); // 打印看看
if([commandName isEqualToString:@"test"]){ // 判断名字是什么执行相应的操作
NSLog(@"做任何你想做的事情(使用self的时候用weakSelf比较好,据说是因为js会强引用oc的东西。)");
return NO;// 最好返回NO,不然会出现一些奇怪的事情。
}
}
return YES;
}
(2)oc调用js
这个就没什么好写的了,
做网页的会给你一个js函数名func,直接使用下面的方法就可以了
[self.webView stringByEvaluatingJavaScriptFromString:func];
例如本人遇到的是传参的函数
她给我的函数名是:window.myApp.services.cameraHandler(error,string);// 没错,他给我的就是这个,通常不是什么test();之类的么。
然后就拼接一下就行了,对了这个是要传参数的
第一个参数顾名思义是错误,开玩笑,我怎么会有错误,不传,(注意可以不传,他们那边就是null,你要是穿个null 或者nil ,他们那边不是null,我也不懂是不是这样,但是我做的时候就是这样啊!)
第二个参数是要传一些值:就传一个字符串吧@“silly boy!”
NSString *pathStr =@“silly boy!”;
//将参数拼接到js函数中
NSString *path = [NSString stringWithFormat:@"window.myApp.services.cameraHandler('','%@');",pathStr];
// 执行js代码
[self.webView stringByEvaluatingJavaScriptFromString:path];
End
二。使用第三方WebViewJavascriptBridge
(https://github.com/marcuswestin/WebViewJavascriptBridge)
第三方的还是自己研究吧,我就不多写了。(好吧我承认我是没用过)
*在iOS / OSX的桥梁,为在UIWebViews / WebViews的OBJ-C与JavaScript之间发送消息**很多人在用(哇咔咔),本人项目小用原生的就行了。
三。iOS7里的JavaScriptCore framework
使用这个,还是自行百度吧,网上一大堆代码。可以参考这个:http://justsee.iteye.com/blog/2036713
四。iOS8WKWebView
给个链接自己看吧,有好的告诉我,我也看看。
https://lvwenhan.com/ios/460.html
本人是菜鸟,如有错误请指正,欢迎交流。
网友评论