首先. IOS客户端经常需要和WEB一起集合,WEB的点击事件推出控制器的(虽然可以通过拦截做到)或者原生客户端需要把一些数据传给h5web端的,这时候就需要交互
1.比如h5的点击有两种写法 分别对应不同的代理方法.
方法一:
<input type="button" value="IOS端的数据接收" onclick="going.calculateForJS(input.value);" />//对应代理方法一 ]
}
方法二 :对应代理方法二
<input type="button" value="交互按钮" onclick="going.pushtextroom('TextRoomViewController');" />
这边注意的是 going和pushtextroom和TextRoomViewController主要这三个字段;
客户端需要这样在.h文件记得导入头文件
import <JavaScriptCore/JavaScriptCore.h>
@protocol TestJSExport <JSExport>//制定协议 不同协议对应的代理方法名不一样
JSExportAs
(calculateForJS /** handleFactorialCalculateWithNumber 作为js方法的别名 */,
- (void)handleFactorialCalculateWithNumber:(NSNumber *)number
);//方法待参数 - (void)pushtextroom:(NSString *)view;//这个view的参数就是你要推出控制器的参数
这边得pushtextroom和h5上面按钮的要一致
@end
@interface JSCallOCViewController : UIViewController<UIWebViewDelegate,TestJSExport> //代理方法TextJSEport
@property (strong, nonatomic) JSContext *context;//中间交互的上下文
@end
.m
第二步//在webview加载成功的代理方法里面试下
-
(void)webViewDidFinishLoad:(UIWebView *)webView {
self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];//固定写法
// 打印异常
self.context.exceptionHandler =
^(JSContext *context, JSValue *exceptionValue)
{
context.exception = exceptionValue;
NSLog(@"%@", exceptionValue);
};self.context[@"gonding"] = self;// 把自己设置为代理 扣号里面声明的要和h5的那个上面提到的一致
}
-
(void)handleFactorialCalculateWithNumber:(NSNumber *)number
{NSNumber *result = @1000000;
NSLog(@"%@", result);
[self.context[@"showResult"] callWithArguments:@[result]];//result就是你要传的数据
//这个代理方法是把数据传给h5端
h5声明要用showrResult来接收
h5端需要
<head>
......前面一些省略
<script type="text/javascript">function showResult(resultNumber) { //alert(resultNumber); document.getElementById("result").innerText = resultNumber; }
</script>
</head>
}
另一个代理方法是推出控制器 -
(void)pushtextroom:(NSString *)view{
NSLog(@"%@",view);Class second = NSClassFromString(view);
id secondVC = [[second alloc]init];
[self.navigationController pushViewController:secondVC animated:YES];
}