1. 程式人生 > >iOS原生與H5頁面互動

iOS原生與H5頁面互動

一、原生框架<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>