[iOS]iOS與H5交互實戰(zhàn)

首先,先列舉幾個常用場景(本人項目實戰(zhàn)中經歷過的):

1.通過js調用native的組件(例如經典的二維碼掃描功能)
2.點擊H5界面調用native的控制器,進行跳轉
3.在native中編寫js代碼維護H5中的內容

以上三個差不多就是我用到過的場景.

下面分別開始介紹交互方式,這里我用的是JavaScirptCore + UIWebView:
1.js調用本地組件

js端代碼:

/*注解:這里采用nativeObj.goSomeWhere()的方式進行跳轉,主要是為了配合安卓端的交互方式(ios和安卓共用一套js代碼),
nativeObj是一個統(tǒng)一的對象,代表原生的內容,通過點語法調用方法跳轉,后面會說到如何產生這個公用的對象*/
<html>
<head>
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
</head>
<script type="text/javascript">
//回調支付的結果
    function NativePayCallback(result) {
        console.log("NativePayCallback------"+result);
        document.getElementById("native_info").innerHTML = result.code;
    }
//回調登錄結果
    function NativeLoginCallback(result) {
        console.log("NativeLoginCallback------"+result);
        document.getElementById("native_info").innerHTML = result;
    }
//回調掃碼結果
    function scanBarcodeCallback(result) {
        console.log("scanBarcodeCallback------"+result);
        document.getElementById("native_info").innerHTML = result;
    }
//退后
    function goBackNative() {
        nativeObj.goBackNative('');
    }
//跳轉到支付界面
    function goNativePay() {
        var jsonObj = {
            totalFee:"3.32",
            from:"OtherAPP",
            orderNum:"xxxxxxxxxx"
        };
        var jsonStr=JSON.stringify(jsonObj);
        nativeObj.goNativePay(jsonStr);
    }
//跳轉到登錄頁
    function goNativeLogin() {
        nativeObj.goNativeLogin('');
    }
//跳轉到掃碼頁
    function scanBarcode() {
        nativeObj.scanBarcode('');
    }
//得到用戶信息
    function getNativeUserInfo(){
        var userInfo=nativeObj.getNativeUserInfo('');
        console.log("getNativeUserInfo------"+userInfo);
        var obj = JSON.parse(userInfo);
        console.log(obj.code + ", " + obj.data+", " + obj.msg);
        document.getElementById("native_info").innerHTML = obj.code + ", " + obj.data+", " + obj.msg;
    }
</script>
<body>
<input type="button" value="關閉activity" onClick="goBackNative()"/>
<input type="button" value="支付" onClick="goNativePay()"/>
<input type="button" value="登錄" onClick="goNativeLogin()"/>
<input type="button" value="掃二維碼" onClick="scanBarcode()"/>
<input type="button" value="獲取個人信息" onClick="getNativeUserInfo()"/>
<text id="native_info"></text>
</body>
</html>

native原生端代碼,說明一下,如果是采用nativeObj.goSomeWhere的方式進行交互,那么我們需要用到JavaScriptCore中的JSExport協(xié)議(具體用法我不贅述),直接上代碼:

//這里我是自己創(chuàng)建了一個TPNativeFunctionTool的工具類,用于統(tǒng)一處理交互事件,
繼承了JSExport協(xié)議,在協(xié)議中聲明js中的對應方法
@protocol myJSExports <JSExport>
//退后
- (void)goBackNative;
//跳轉支付界面,json是傳遞過來的支付參數(shù)
- (void)goNativePay:(id)json;
//跳轉登錄界面
- (void)goNativeLogin;
//跳轉掃碼界面
- (void)scanBarcode;
//獲取本地用戶信息
- (void)getNativeUserInfo;
//H5界面跳轉到本地控制器,通過url進行跳轉
- (void)gotoNativeView:(id)url;

@end

然后在TPNativeFunctionTool.m文件中實現(xiàn)這些方法

- (void)goBackNative{
    [self.vc.navigationController popViewControllerAnimated:YES];
}

- (void)goNativePay:(id)json{
    ThirdPayViewController *payVc = [[ThirdPayViewController alloc] init];
    payVc.orderNum = @"XXXXXXXXXXXXX";
    payVc.OrderType = @"0";
    [self.vc.navigationController pushViewController:payVc animated:YES];
}

- (void)goNativeLogin{
   LoginViewController *loginVc = [[LoginViewController alloc] init];
   [self.vc.navigationController pushViewController:loginVc animated:YES];
}

- (void)scanBarcode{
    TPH5ScanQRCodeViewController *qrVc = [[TPH5ScanQRCodeViewController alloc] init];
    qrVc.style = [self getScanStyle];
    tpWeakSelf
    //回調掃描結果
    qrVc.result = ^(NSString *result){
        weakSelf.QRCodeResult = result;
    };
    [self.vc.navigationController pushViewController:qrVc animated:YES];
}

- (void)getNativeUserInfo{
    
}

native控制器端的代碼:
(1)生成一個js環(huán)境:

/*
 *懶加載一個js環(huán)境
 */
- (JSContext *)context{
    if (!_context) {
        _context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
    }
    return _context;
}

(2)webView的webViewDidFinishLoad代理方法中,關聯(lián)我們的native對象,注意點是必須關聯(lián)到才能進行交互

/*需要關聯(lián)的類*/
- (TPNativeFunctionTool *)native{
    if (!_native) {
        _native = [[TPNativeFunctionTool alloc] initWithVc:self];
    }
    return _native;
}

- (void)webViewDidFinishLoad:(UIWebView *)webView{
//這個對象就是我們遵守了JSExport協(xié)議的那個類
    self.context[@"nativeObj"] = self.native;

這樣,我們就已經實現(xiàn)了最基本的跳轉交互了,是不是很神奇,我也覺得.但我們如何將參數(shù)回調給H5呢?這時我們需要實現(xiàn)如下方法(只舉一個例子,后面都大同小異):

//回調二維碼掃描參數(shù)
- (void)getQRCode{
    //通過context獲得js中scanBarcodeCallback方法的環(huán)境
    //JSValue可以用來獲取js中的方法
    JSValue *func = self.context[@"scanBarcodeCallback"];
   //回調的二維碼參數(shù)
    NSString *result = self.native.QRCodeResult;
    if (result == nil) return;

    //回調的參數(shù)格式
    NSString *code = @"1";
    NSDictionary *data = @{@"data":result};
    NSString *msg = @"";
    NSDictionary *resultDict = @{@"code":code,@"data":data,@"msg":msg};

    //將字典轉化成json串,進行回調
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:resultDict options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonResult = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];

    //通過callWithArguments方法來進行參數(shù)回調即可
    [func callWithArguments:@[jsonResult]];
    
}

2.通過url跳轉到本地控制器
這里我用的是DCURLRoutter,來進行url的跳轉,詳情請點擊查看.
項目中的代碼:

/*注釋:傳入一個url,url包含了一個協(xié)議頭和對應控制器的映射參數(shù),
經過DCLURLRouter的解析后,轉換成對應的控制器,然后進行跳轉.例如url是"native://login"==>"LoginViewController"這個控制器,我們只需要傳入"native://login"就能進行對應的跳轉*/
//這里我封裝了它的方法
+ (void)PushNativeViewController:(NSString *)url animated:(BOOL)Yes{
    [DCURLRouter pushURLString:url animated:YES];
}

3.在native中編寫js代碼,這里我的實用場景是,服務器返回的HTML中圖片尺寸過大, 于是在native中添加js代碼進行規(guī)范

- (void)webViewDidFinishLoad:(UIWebView *)webView{
    NSString *js = @"function imgAutoFit() { \
    var imgs = document.getElementsByTagName('img'); \
    for (var i = 0; i < imgs.length; ++i) {\
    var img = imgs[i];   \
    img.style.maxWidth = %f;   \
    } \
    }";
    js = [NSString stringWithFormat:js, [UIScreen mainScreen].bounds.size.width - 20];
    
    [webView stringByEvaluatingJavaScriptFromString:js];
    [webView stringByEvaluatingJavaScriptFromString:@"imgAutoFit()"];
}

其實還嘗試過WKWebView的交互方式,可項目中不利于和安卓的統(tǒng)一,就放棄了,那種方式也是一種非常簡單明了的交互方式,有興趣的同學可以自行去研究下.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末抒线,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嘶炭,更是在濱河造成了極大的恐慌眨猎,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,826評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寺渗,死亡現(xiàn)場離奇詭異兰迫,居然都是意外死亡,警方通過查閱死者的電腦和手機涡拘,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,968評論 3 395
  • 文/潘曉璐 我一進店門鳄乏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來棘利,“玉大人,你說我怎么就攤上這事赡译〔幻” “怎么了裹唆?”我有些...
    開封第一講書人閱讀 164,234評論 0 354
  • 文/不壞的土叔 我叫張陵只洒,是天一觀的道長。 經常有香客問我成畦,道長涝开,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,562評論 1 293
  • 正文 為了忘掉前任拄养,我火速辦了婚禮银舱,結果婚禮上寻馏,老公的妹妹穿的比我還像新娘。我一直安慰自己诚欠,他們只是感情好,可當我...
    茶點故事閱讀 67,611評論 6 392
  • 文/花漫 我一把揭開白布家乘。 她就那樣靜靜地躺著仁锯,像睡著了一般翔悠。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蓄愁,一...
    開封第一講書人閱讀 51,482評論 1 302
  • 那天撮抓,我揣著相機與錄音,去河邊找鬼站超。 笑死,一個胖子當著我的面吹牛死相,可吹牛的內容都是我干的算撮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,271評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陷舅,長吁一口氣:“原來是場噩夢啊……” “哼审洞!你這毒婦竟也來了?” 一聲冷哼從身側響起缩赛,我...
    開封第一講書人閱讀 39,166評論 0 276
  • 序言:老撾萬榮一對情侶失蹤撰糠,失蹤者是張志新(化名)和其女友劉穎阅酪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體术辐,經...
    沈念sama閱讀 45,608評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡辉词,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,814評論 3 336
  • 正文 我和宋清朗相戀三年瑞躺,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片幢哨。...
    茶點故事閱讀 39,926評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡捞镰,死狀恐怖毙替,靈堂內的尸體忽然破棺而出践樱,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,644評論 5 346
  • 正文 年R本政府宣布解孙,位于F島的核電站抛人,受9級特大地震影響,放射性物質發(fā)生泄漏廷臼。R本人自食惡果不足惜绝页,卻給世界環(huán)境...
    茶點故事閱讀 41,249評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望莱没。 院中可真熱鬧酷鸦,春花似錦、人聲如沸嘹裂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,866評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽例嘱。三九已至宁舰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腋腮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,991評論 1 269
  • 我被黑心中介騙來泰國打工即寡, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留聪富,地道東北人。 一個月前我還...
    沈念sama閱讀 48,063評論 3 370
  • 正文 我出身青樓蒂萎,卻偏偏與公主長得像胸蛛,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子阵面,可洞房花燭夜當晚...
    茶點故事閱讀 44,871評論 2 354

推薦閱讀更多精彩內容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,127評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫仑扑、插件置鼻、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,103評論 4 62
  • 百無聊賴沃疮,得鶯鶯傳盒让,感二人情之深切,恨之綿綿司蔬,幾番浮沉后邑茄,終為良眷。孤月又懸俊啼,嘆無舉案引鵲者肺缕,獨臨水自憐,...
    白衣小潘安閱讀 284評論 0 3
  • -1- 過年的時候回了趟老家授帕,本想像兒時一樣重溫一下長輩們的親情同木,結果卻大出我所料。 看著我長大的長輩們齊聚姥姥家...
    子莯青青閱讀 822評論 5 8
  • 悶熱的一天跛十,耳邊傳來一陣噼里啪啦的聲音彤路,耳朵頓時豎了起來,側看窗外芥映,串珠一樣的雨使勁地拍打地面洲尊,似乎在抱怨著為何這...
    Marryme1984閱讀 89評論 0 0