iOS原生與H5頁面互動
阿新 • • 發佈:2019-01-30
一、原生框架<JavaScriptCore/JavaScriptCore>
(1)JavaScriptCore: 是一種JavaScript引擎,主要為webKit提供指令碼處理能力,可以JS呼叫OC,也可以OC呼叫JS;
(2) JSContext: 代表了JS的執行環境,通過-evalueScript: 方法就可以執行-- JS程式碼;
(3) JSValue: 他封裝了JS與OC中對應的型別,以及呼叫JS的API等;
(4) JSExport: 是一個協議,遵守此協議,就可以定義我們自己的協議,在協議中宣告的API都會在JS中暴露出來,才能呼叫;
二、互動方法
1.第一種:直接攔截H5頁面中點選事件的URL,可以擷取這個URL中的引數,進行拼接,然後跳轉到自己指定的介面;
#pragma mark ------------ 互動 -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { // 直接 擷取後面的id NSString *str = request.URL.resourceSpecifier; NSLog(@"request.URL.resourceSpecifier = %@",request.URL.resourceSpecifier); NSString *strTwo = [NSString stringWithFormat:@"http:%@",str]; NSRange range = [strTwo rangeOfString:@"newbieImg/"]; if (range.location != NSNotFound) { NSArray *array = [strTwo componentsSeparatedByString:@"newbieImg/"]; NSString *strId = array[1]; NSLog(@"strId = %@", strId); CCCCCViewController *courseVC = [[CCCCCViewController alloc] init]; courseVC.urlId = strTwo; [self.navigationController pushViewController:courseVC animated:YES]; return NO; } return YES; }
2.需要與後臺也就是寫H5的人約定方法。但這裡有兩種方法,一種是JS呼叫OC, 一種是OC呼叫JS
(1)JS呼叫OC,並且傳遞引數
//第一步 新增框架,引入標頭檔案 #import <JavaScriptCore/JavaScriptCore.h> @interface WebCenterViewController ()<UIWebViewDelegate> @property(nonatomic,strong) UIWebView *webView; //第二步 宣告屬性 @property (nonatomic, strong) JSContext *context; @end
第三步,就需要知道後臺指定的方法是什麼了,比如
test1是一個無引數的方法,test2是一個有引數的方法,這時我們就可以在webView網頁載入完畢的那個方法中寫到:
#pragma mark ------------ webView載入完畢
-(void)webViewDidFinishLoad:(UIWebView *)webView
{ NSLog(@"網頁載入完畢");
//在網頁載入完成後,獲取每個引數
//獲取JS的執行環境
_context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//JS呼叫無引數OC
__weak WebCenterViewController *weakSelf = self;
_context[@"test1"] = ^() {
[weakSelf methond];
};
//JS呼叫有引數的OC
_context[@"test2"] = ^() {
//用陣列接收傳過來的多個引數
NSArray *paramArray = [JSContext currentArguments];
//然後取出相對應的值
NSString *str1 = paramArray[0];
NSString *str2 = paramArray[1];
[weakSelf methondParam:str1 withStr:str2];
};
}
//無引數的方法
- (void)methond {
NSLog(@"呼叫無引數的方法");
}
//有引數的方法
- (void)methondParam:(NSString *)str1 withStr:(NSString *)str2 {
NSLog(@"str1 = %@, str2 = %@", str1, str2);
}
注意::::呼叫的方法名test1,test2,一定要和html中的保持一致!!!!!!
(2)OC呼叫JS , OC 向 JS 傳遞引數
只需要在點選方法中,初始化所要傳遞的物件,然後,利用stringByEvaluatingJavaScriptFromString此方法進行傳引數:
#pragma mark ------------ OC 呼叫 JS
/*
1. OC 呼叫 JS 只需在所需要傳值的地方獲取到JS中的點選方法即可
例如: 點選方法是下面的這個 functionAction
*/
- (void)functionAction {
//如果需要傳遞引數 給 JS,則初始化引數
NSString *str2 = @"1234mkfg";
NSString *str3 = @"kdsfj";
//傳引數
[_webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"func('%@', '%@');", str2, str3]];
}</span>
</span>