JS代用原生OC
方式一:url攔截凡蚜,這里略過
注意:在iOS中攔截到的url scheme將全部轉(zhuǎn)化為小寫人断;
html中需要設(shè)置編碼,否則中文參數(shù)可能會(huì)出現(xiàn)編碼問題朝蜘;
JS用打開一個(gè)iFrame的方式替代直接用document.location的方式恶迈,document.location 有一個(gè)很嚴(yán)重的問題,就是如果我們連續(xù) 2 次改 document.location 的話谱醇,在 delegate 方法中暇仲,只能截獲后面那次請(qǐng)求步做,前一次請(qǐng)求由于很快被替換掉,所以被忽略掉奈附。
方式二:通過JavaScriptCore(iOS 7之后)辆床,用來做JS交互,因此JS與原生OC交互也變得簡單了許多桅狠。
//獲取js上下文,及本地添加js調(diào)用方法轿秧,一般情況下都放在-(void)webViewDidFinishLoad:(UIWebView *)webView方法里中跌。
-(void)webViewDidFinishLoad:(UIWebView *)webView{
//獲取js上下文
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//添加js代用方法
self.jsContext[@"ocGetValueFromJS"]= ^(){
NSArray *array = [JSContext currentArguments];
for (NSString *value in array) {
NSLog(@"收到j(luò)s值:%@",value);
}
};
//異常處理
self.jsContext.exceptionHandler = ^(JSContext* context,JSValue *exceptionValue){
context.exception = exceptionValue;
NSLog(@"異常信息:%@", exceptionValue);
};
}
方式三:同方式二相似,通過JSExport協(xié)議
@protocol JSObjcDelegate<JSExport>
-(void)getMessage:(id)msg;
@end
@interface WebViewController ()<UIWebViewDelegate,JSObjcDelegate>
-(void)webViewDidFinishLoad:(UIWebView *)webView{
//獲取js上下文
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//設(shè)置代理
self.jsContext[@"ios"]= self;
//異常檢查菇篡,當(dāng)oc本地調(diào)用的js方法不存時(shí)漩符,會(huì)打印異常信息
self.jsContext.exceptionHandler = ^(JSContext* context,JSValue *exceptionValue){
context.exception = exceptionValue;
NSLog(@"異常信息:%@", exceptionValue);
};
}
//代理方法的實(shí)現(xiàn)
-(void)getMessage:(id)message{
NSLog(@"getMessage-------%@",message);
}
OC調(diào)用JS
方式一
NSString *jsText = [NSString stringWithFormat:@"jsGetValueFromOc('%@')",@"哈哈"];
[self.webView stringByEvaluatingJavaScriptFromString:jsText];
方式二
通過使用JavaScriptCore
JSValue *callback = self.jsContext[@"jsGetValueFromOc"];
[callback callWithArguments:@[@"222"]];
或者
NSString *jsText = @"jsGetValueFromOc('222')";
[self.jsContext evaluateScript:jsText];
注意:stringByEvaluatingJavaScriptFromString是一個(gè)同步的方法,使用它執(zhí)行JS方法時(shí)驱还,如果JS 方法比較耗的時(shí)候嗜暴,會(huì)造成界面卡頓。
官方推薦使用WKWebView(ios8)的evaluateJavaScript:completionHandler:代替這個(gè)方法议蟆。