UIWebView與H5的交互

從iOS7之後,蘋果公司就提供JavaScriptCore.framework開發庫,用於支持H5與Native的交互。最近研究一下,網絡上也有很多的開發用於支持UIWebView與H5的交互的開發庫,例如:WebViewJavaScriptBridge。還有一個關於JS與Native交互的開發庫:JSPatch;在這裏不對他們做闡述,我主要闡述一下“H5代碼如何與上層的Native交互”。

主要就是採用JavaScriptCore.framework,關於這個開發庫的使用,大家可以百度一下。
直接上代碼吧:

//
//  WebViewJSPatch.m
//  CommonProject
//
//  Created by wuyoujian on 16/6/30.
//  Copyright © 2016年 wuyoujian. All rights reserved.
//

#import "WebViewJSPatch.h"

static NSString *const jsContextKeyPath =@"documentView.webView.mainFrame.javaScriptContext";

@implementation WebViewJSPatch

/**
 *  向webview中註冊js調用Native的api
 *  @param webView 對應的WebView
 *  @param apiName 對應的js的function名稱
 *  @param apiBlock 對應的Native的實現block
 */

+ (void)registNativeAPIInWebView:(UIWebView*)webView apiName:(NSString*)apiName apiBlock:(WebViewJSPatchBlock)apiBlock {

    JSContext *context = [webViewvalueForKeyPath:jsContextKeyPath];
    if (context && [contextisKindOfClass:[JSContextclass]]) {
        context[apiName] = ^() {

            NSArray *args = [JSContextcurrentArguments];
            for (JSValue *jsValin args) { NSLog(@"%@", jsVal.toString);}

            dispatch_async(dispatch_get_main_queue(), ^{
                //
                if (apiBlock) {
                    apiBlock(args);
                }
            });
        };
    }
}


/**
 *  在webView中執行js
 *  @param webView 對應的WebView
 *  @param script 需要執行的js代碼
 */

+ (JSValue*)evaluateScriptWebView:(UIWebView*)webView script:(NSString*)script {
    JSContext *context = [webViewvalueForKeyPath:jsContextKeyPath];

    if (context && [contextisKindOfClass:[JSContextclass]]) {
        return [contextevaluateScript:script];
    }

    returnnil;
}

@end

使用方法:

1、js調用Native(即H5調用Native API)

可以直接在UIWebView初始化完成之後,調用WebViewJSPatch類方法registNativeAPIInWebView註冊js需要調用的Native的方法,本質上是註冊一個block;

2、Native調用js

這個有兩種方式,UIWebView本身提供:stringByEvaluatingJavaScriptFromString 方法,在這裏我們採用JSContext方式來調用js;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章