1.HTML調(diào)用iOS中的方法
方法一:通過(guò)攔截點(diǎn)擊方法的href.(你可以這樣理解:點(diǎn)擊網(wǎng)頁(yè)中的一個(gè)按鈕跳轉(zhuǎn)到百度首頁(yè),其實(shí)這個(gè)按鈕的href屬性就是)
//在webView的代理方法中根據(jù)URL來(lái)判斷是否需要調(diào)用iOS中的方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
NSLog(@"%@", request.URL.absoluteString);
// HTML中跳轉(zhuǎn)第美,事件等操作都會(huì)攜帶一個(gè)URL蝶锋,并且在這里都會(huì)截取到。和前端同事商量共同規(guī)定這一協(xié)議(當(dāng)然可以隨意)
NSString *str = request.URL.absoluteString;
// @"ecm:///openCamera"
NSRange range = [str rangeOfString:@"ecm:///"];
NSUInteger location = range.location;
if (location != NSNotFound) {// 取到指定的協(xié)議頭時(shí)執(zhí)行相應(yīng)的方法
NSString *method = [str substringFromIndex:location + range.length];
SEL sel = NSSelectorFromString(method);
[self performSelector:sel];
}
return YES;
}
方法二:JSExport 協(xié)議關(guān)聯(lián) native對(duì)象什往,進(jìn)而調(diào)用對(duì)象協(xié)議中約定的方法
需求描述:在A控制器扳缕,當(dāng)點(diǎn)擊一個(gè)按鈕后跳轉(zhuǎn)到B控制器,B控制器通過(guò)UIWebView加載一個(gè)后端用js寫好的頁(yè)面别威。此時(shí)躯舔,我們?cè)邳c(diǎn)擊頁(yè)面上的關(guān)閉按鈕返回到我們的A控制器。
分析:A控制器是我們客戶端寫的省古,而B控制器雖然是我們寫的庸毫,但是加載的網(wǎng)頁(yè)不是我們寫的,所在在點(diǎn)擊網(wǎng)頁(yè)上的按鈕時(shí)衫樊,就需要調(diào)用我們OC的方法來(lái)實(shí)現(xiàn)返回到A控制器飒赃。
//
// VertyCodeController.h
// Ecm
//
// Created by zengchunjun on 16/10/26.
//
#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>
// 定義一個(gè)遵循JSExport協(xié)議的協(xié)議。方法名必須與js調(diào)用的方法名一致科侈,下面是我實(shí)際工作中的一個(gè)簡(jiǎn)單需求载佳。若帶有參數(shù)的方法,則我們定義的協(xié)議的方法可以隨意拆分但是組合在一起也必須和js調(diào)用的方法名一致
@protocol vertyCodeJSProtocol <JSExport>
- (void)closeView;
@end
@interface VertyCodeController : UIViewController
@end
//
// VertyCodeController.m
// Ecm
//
// Created by zengchunjun on 16/10/26.
//
//
#import "VertyCodeController.h"
#import "Util.h"
#import "LoginView.h"
// 遵守定義的協(xié)議臀栈,實(shí)現(xiàn)相應(yīng)的方法蔫慧。
@interface VertyCodeController ()<UIWebViewDelegate,vertyCodeJSProtocol>
@property (nonatomic,weak)UIWebView *webView;
@property (nonatomic,strong)JSContext *context;
@end
@implementation VertyCodeController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view
self.view.backgroundColor = [UIColor whiteColor];
self.title = @"登錄驗(yàn)證";
UIWebView *webView = [UIWebView new];
webView.frame = self.view.frame;
self.webView = webView;
self.webView.delegate = self;
[self.view addSubview:self.webView];
NSString *codeUrl = @"需要打開(kāi)的網(wǎng)頁(yè)"; // [Util getMessage_register_code_url];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
[self.webView loadRequest:request];
}
- (void)closeView
{
[LoginView Instance].stateText.text = @"驗(yàn)證通過(guò),請(qǐng)重新登錄";
[self dismissViewControllerAnimated:YES completion:nil];
}
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
// JSExport 協(xié)議關(guān)聯(lián) native對(duì)象权薯,進(jìn)而調(diào)用對(duì)象協(xié)議中約定的方法
// 獲取該UIWebview的javascript執(zhí)行環(huán)境姑躲。
self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 異常處理
self.context.exceptionHandler =
^(JSContext *context, JSValue *exceptionValue)
{
context.exception = exceptionValue;
NSLog(@"%@", exceptionValue);
};
// 其實(shí)服務(wù)端在點(diǎn)擊關(guān)閉按鈕時(shí)調(diào)用的方法就是 ecm.closeView()
// 帶一個(gè)參數(shù)ecm.returnOneParame(str),則我們協(xié)議中定義的方法就需要寫成 - (void)returnoneparamwe:(NSString *)str
// 帶兩個(gè)參數(shù)ecm.returnfirstsecond(str1,str2),則我們協(xié)議中定義的方法就需要寫成 - (void)returnfirst:(NSString *)str1 second:(NSString *)str2;總結(jié)盟蚣,方法名保持一致
self.context[@"ecm"] = self;
}
@end
//實(shí)現(xiàn)訪問(wèn)相冊(cè)
- (void)openCamera{
UIImagePickerController *pickerVC = [[UIImagePickerController alloc] init];
pickerVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
[self presentViewController:pickerVC animated:YES completion:nil];
}
2.當(dāng)HTML調(diào)用iOS中方法后黍析,一般會(huì)傳數(shù)據(jù)給服務(wù)端,這時(shí)就需要iOS調(diào)用HTML的方法
iOS 中調(diào)用HTML的方法用stringByEvaluatingJavaScriptFromString
// js交互屎开,oc調(diào)用js方法
- (void)passValues:(NSArray *)list
{
//根據(jù)服務(wù)端的數(shù)據(jù)格式要求整理數(shù)據(jù)
NSMutableArray *dataArray = [NSMutableArray array];
for (int i = 0; i < list.count; i++) {
Contact *contact = list[i];
NSString *account = contact.account;
[dataArray addObject:account];
}
NSDictionary *dataDic = @{@"data":dataArray,@"message":@"調(diào)用成功",@"status":@0};
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dataDic options:NSJSONWritingPrettyPrinted error:nil];
NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
// 直接調(diào)用HTML的方法括號(hào)內(nèi)是需要傳遞的參數(shù)
[self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"selectedUsersComplete(%@)",jsonStr]];
}