亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS與網頁JS交互詳解及實例

2020-07-26 02:59:48
字體:
來源:轉載
供稿:網友

 IOS與網頁JS交互

隨著移動APP的快速迭代開發趨勢,越來越多的APP中嵌入了html網頁,但在一些大中型APP中,尤其是電商類APP,html頁面已經不僅僅滿足展示功能,這時html要求能與原生語言進行交互、相互傳值。比如攜程APP中一個熱門景點的網頁中,點擊某個景點,可以跳轉到原生中的該景點詳情頁控制器。

為此,我整理了三種最常用最便捷有效的OC與JS交互的方式,供大家學習交流。

第一種:JS給OC傳值。

1. 技術方案:使用JavaScriptCore.framework框架

2. 使用場景: 網頁中代碼中的某個方法,比如點擊事件方法,將該方法的參數傳值給OC,供OC使用。

比如:攜程APP中一個熱門景點的網頁中,有很多個熱門景點,點擊某個景點的圖片或名稱,可以跳轉到原生中的該景點詳情頁控制器。

3. 代碼實現如下:

OC里要實現的代碼:

拖入JavaScriptCore.framework靜態庫,遵守UIWebViewDelegate代理協議。

在-webViewDidFinishLoad:方法里編寫如下代碼:

- (void)webViewDidFinishLoad:(UIWebView *)webView{  JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];  context[@"passValue"] = ^{    NSArray *arg = [JSContext currentArguments];    for (id obj in arg) {      NSLog(@"%@", obj);    }  };}

其中 passValue 是JS的函數名,得到的 arg數組 里面為JS的 passValue 函數的參數,即 JS要傳給OC的參數。

JS里要實現的代碼:

function testClick()      {        var str1=document.getElementById("text1").value;        var str2=document.getElementById("text2").value;        passValue(str1,str2);      }

在需要給OC傳值的函數里(例如:testClick())直接調用 passValue()函數,將值傳進去即可。

第二種:JS給OC傳值。

1. 技術方案:使用自定義url方法,每次點擊網頁

2. 使用場景: 網頁中代碼中的某個方法,比如點擊事件方法,將該方法的參數傳值給OC,供OC使用。

比如:攜程APP中一個熱門景點的網頁中,有很多個熱門景點,點擊某個景點的圖片或名稱,可以跳轉到原生中的該景點詳情頁控制器。

3. 代碼實現如下:

JS里要實現的代碼:

 function testClick()      {        var str1=document.getElementById("text1").value;        var str2=document.getElementById("text2").value;        // "objc://"為自定義協議頭;        // str1&str2為要傳給OC的值,以":/"作為分隔        window.location.href="objc://"+":/"+str1+":/"+str2;      }

在需要給OC傳值的函數里(例如:testClick())寫如上格式的代碼。

其中 objc:// 是自定義的協議頭,str1與str2為JS要傳給OC的值。

OC里要實現的代碼:

//遵守UIWebViewDelegate代理協議。-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{  //拿到網頁的實時url  NSString *requestStr = [[request.URL absoluteString] stringByRemovingPercentEncoding];  //在url中尋找自定義協議頭"objc://"  if ([requestStr hasPrefix:@"objc://"]) {    // 以"://"為中心將url分割成兩部分,放進數組arr    NSArray *arr = [requestStr componentsSeparatedByString:@"://"];    NSLog(@"%@",arr);    //取其后半段    NSString *paramStr = arr[1];    NSLog(@"%@",paramStr);    //以":/"為標識將后半段url分割成若干部分,放進數組arr2,此時arr2[0]為空,arr2[1]為第一個傳參值,arr2[2]為第二個傳參值,以此類推    NSArray *arr2 = [paramStr componentsSeparatedByString:@":/"];    NSLog(@"%@",arr2);    //取出參數,進行使用    if (arr2.count) {      NSLog(@"有參數");      [self doSomeThingWithParamA:arr2[1] andParamB:arr2[2]];    }else{      NSLog(@"無參數");    }    return NO;  }  return YES;}//對JS傳來的值進行調用- (void)doSomeThingWithParamA:(id)paramA andParamB:(id)paramB{  NSLog(@"%@  %@", paramA, paramB);}

第三種:利用第三方庫實現JS與OC的相互傳值。

1. 技術方案:使用WebViewJavascriptBridge三方庫

2. 使用場景: 網頁中代碼中的某個方法,比如點擊事件方法,將該方法的參數傳值給OC,供OC使用。

比如:攜程APP中一個熱門景點的網頁中,有很多個熱門景點,點擊某個景點的圖片或名稱,可以跳轉到原生中的該景點詳情頁控制器。
或者將原生中的用戶信息傳遞給網頁,以便其個性化展示

3. 代碼實現如下:

OC傳值給JS

JS里需要實現的代碼:

function setupWebViewJavascriptBridge(callback) {    if (window.WebViewJavascriptBridge) { return callback(WebViewJavascriptBridge); }    if (window.WVJBCallbacks) { return window.WVJBCallbacks.push(callback); }    window.WVJBCallbacks = [callback];    var WVJBIframe = document.createElement('iframe');    WVJBIframe.style.display = 'none';    WVJBIframe.src = 'wvjbscheme://__BRIDGE_LOADED__';    document.documentElement.appendChild(WVJBIframe);    setTimeout(function() { document.documentElement.removeChild(WVJBIframe) }, 0)  }  //調用上面定義的函數  setupWebViewJavascriptBridge(function (bridge){    //OC傳值給JS 'testJavascriptHandler'為雙方自定義好的統一方法名;'data'是OC傳過來的值;'responseCallback'是JS接收到之后給OC的回調    bridge.registerHandler('testJavascriptHandler', function(data, responseCallback) {        //打印OC傳過來的值        log('ObjC called testJavascriptHandler with', data)        var responseData = { 'Javascript Says':'Right back atcha!' }        log('JS responding with', responseData)        //給OC的回調        responseCallback(responseData)      })

OC里需要實現的代碼:

導入第三方庫WebViewJavascriptBridge;遵守UIWebViewDelegate;

 //設置第三方Bridge是否可用  [WebViewJavascriptBridge enableLogging];  //關聯webView和bridge  _bridge = [WebViewJavascriptBridge bridgeForWebView:web];  [_bridge setWebViewDelegate:self];  //OC給JS傳值,雙方自定義一個統一的方法名'testJavascriptHandler';data里即為要傳過去的值  [_bridge callHandler:@"testJavascriptHandler" data:@{@"年齡":@"20"}];

JS傳值給OC

JS里需要實現的代碼:

 //點擊網頁上一個按鈕時   callbackBt.onclick = function()   {    var str1=document.getElementById("text1").value;   var str2=document.getElementById("text2").value;   //JS給OC傳值。'passValue'為雙方自定義的統一方法名;'str1'&'str2'為要傳的值; response為OC收到后給JS的回調   bridge.callHandler('passValue', {str1,str2}, function(response) {                })   }

OC里需要實現的代碼:

導入第三方庫WebViewJavascriptBridge;遵守UIWebViewDelegate;

 //設置第三方Bridge是否可用  [WebViewJavascriptBridge enableLogging];  //關聯webView和bridge  _bridge = [WebViewJavascriptBridge bridgeForWebView:web];  [_bridge setWebViewDelegate:self];  //js給oc傳值.'passValue'為雙方自定義的統一方法名;'data'為JS傳過來的值;'responseCallback'為OC收到值后給JS返回的回調  [_bridge registerHandler:@"passValue" handler:^(id data, WVJBResponseCallback responseCallback) {    //打印js傳過來的值    NSLog(@"%@", data);    //返回給js的值    responseCallback(@"收到了");  }];

需要注意的是:不論哪方給哪方傳值,傳值的方法名稱與對應接收值的方法名稱要保持一致。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
大胆欧美人体视频| 国产999精品久久久| 日韩小视频在线观看| 欧美性猛交xxxx黑人猛交| 麻豆乱码国产一区二区三区| 成人黄色av免费在线观看| 午夜精品久久久久久久男人的天堂| 51久久精品夜色国产麻豆| 亚洲a级在线播放观看| 久久久国产在线视频| 中文字幕在线亚洲| 国产日韩在线一区| 91精品国产91久久久久久不卡| 国产福利精品av综合导导航| 性色av一区二区三区在线观看| 国产视频在线一区二区| 欧美亚洲成人精品| 一本色道久久综合狠狠躁篇的优点| 九九精品在线观看| 中文字幕一区二区三区电影| 精品国产乱码久久久久酒店| 久久久精品一区二区| 欧美日韩国产丝袜美女| 久久久成人精品| 亚洲自拍小视频免费观看| 欧美激情在线视频二区| 欧美精品久久久久久久久| 亚洲精品国产福利| 亚洲日本欧美中文幕| 久久视频这里只有精品| 亚洲色图偷窥自拍| 国产精品入口日韩视频大尺度| 伊人伊成久久人综合网站| 欧美尺度大的性做爰视频| 久久6免费高清热精品| 亚洲精品ady| 伦理中文字幕亚洲| 欧美成人午夜剧场免费观看| 波霸ol色综合久久| 欧美中文字幕视频在线观看| 国产精品女视频| 亚洲第一精品夜夜躁人人爽| 性色av一区二区三区| 久久在线精品视频| 热re91久久精品国99热蜜臀| 成人免费网站在线| 中文.日本.精品| 久久久精品国产一区二区| 国产亚洲欧美日韩美女| 国产精品香蕉在线观看| 成人精品久久av网站| 欧美日韩中文字幕综合视频| 另类图片亚洲另类| 亚洲最大的网站| 中文字幕综合一区| 亚洲第一av在线| 精品国产91久久久久久老师| 久久久精品电影| 日韩中文字幕视频| 日本a级片电影一区二区| 91久久久久久国产精品| 日本不卡视频在线播放| 九九热r在线视频精品| 国产69精品久久久| 国产精品igao视频| 亚洲精品wwwww| 亚洲一区久久久| 成人亲热视频网站| 日本成人在线视频网址| 国产精品久久综合av爱欲tv| 国产精品99久久久久久人| 中文字幕日韩欧美在线视频| 国产精品电影久久久久电影网| 欧美精品久久久久久久久| 欧美大尺度激情区在线播放| 国产91热爆ts人妖在线| 亚洲精品视频在线播放| 国产精品视频最多的网站| 在线性视频日韩欧美| 中文字幕一区二区三区电影| 亚洲精品日韩丝袜精品| 日韩电影免费观看在线观看| 亚洲欧洲在线看| 久久精品夜夜夜夜夜久久| 久久久久久久久电影| 疯狂做受xxxx高潮欧美日本| 91在线视频九色| 欧美日韩中文在线| 色青青草原桃花久久综合| 日韩在线免费高清视频| 国产区亚洲区欧美区| 日韩不卡中文字幕| 中文字幕日韩欧美精品在线观看| 久久久精品一区| 操日韩av在线电影| 亚洲第一福利网| 欧美一级淫片丝袜脚交| 亚洲国产一区二区三区在线观看| 久久久免费观看视频| 国产精品一久久香蕉国产线看观看| 久久久久日韩精品久久久男男| 亚洲一区二区三区视频播放| 亚洲一区美女视频在线观看免费| 91精品国产高清久久久久久91| 久久久综合av| 国产精品久久久久久久久久久新郎| 国产精品xxx视频| 97色在线视频观看| 国产精品成人久久久久| 亚洲人a成www在线影院| 日韩精品视频免费在线观看| 日韩精品黄色网| 日韩免费观看高清| 91av视频在线观看| 亚洲人成电影在线观看天堂色| 国产精品欧美亚洲777777| 日韩www在线| 国产一区二区日韩精品欧美精品| 91干在线观看| 亚洲精品资源美女情侣酒店| 成人免费视频在线观看超级碰| 亚洲成人教育av| 热久久免费国产视频| 日韩精品中文字| 欧美综合在线第二页| 热草久综合在线| 国产91精品最新在线播放| 中文字幕日韩欧美在线视频| 国产精品久久久久久久久久久久| 97国产精品免费视频| 亚洲人成绝费网站色www| 欧美日韩在线视频一区| 69久久夜色精品国产7777| 清纯唯美亚洲综合| 日韩黄色高清视频| 亚洲美女精品久久| 秋霞成人午夜鲁丝一区二区三区| 亚洲欧洲在线播放| 992tv在线成人免费观看| 欧美激情手机在线视频| 国产精品青青在线观看爽香蕉| 欧美日韩成人精品| 亚洲欧美制服中文字幕| 久久99国产精品自在自在app| 国产精品第10页| 久久香蕉国产线看观看网| 国产专区欧美专区| 青青青国产精品一区二区| 青青青国产精品一区二区| 日韩av有码在线| 中文字幕久久久| 中文字幕日韩精品有码视频| 欧美激情视频在线免费观看 欧美视频免费一| 欧美性资源免费| 亚洲欧美日本精品| 国产精品av在线| 日韩中文字幕在线视频| 国产91在线播放精品91| 成人夜晚看av| 日韩成人高清在线| 国产精品流白浆视频| 国产精品av免费在线观看| 久久精品99久久香蕉国产色戒| 欧美一区二区视频97|