iOS UIWebView與JavaScript交互

代碼下載地址一
代碼下載地址二

前言

在iOS開發(fā)中,我們經(jīng)常需要加載網(wǎng)頁演侯,在很多時候難免需要和網(wǎng)頁進(jìn)行交互,而這種交互實(shí)質(zhì)上就是UIWebView與JavaScript之間的交互,在iOS7蘋果增加了JavaScriptCore來實(shí)現(xiàn)這種交互眯漩,那么在iOS之前是怎樣來的呢?在這篇文章中就圍繞這些問題來講述麻顶。

iOS執(zhí)行JavaScript代碼

Simulator Screen Shot 2016年11月13日 下午10.40.07.png

客戶端向JS傳遞數(shù)據(jù)赦抖,通過插入JS方法來實(shí)現(xiàn),通過UIWebView的這個方法- (nullable NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script可以執(zhí)行JavaScript代碼:

//定義一個js函數(shù)辅肾,函數(shù)的功能是彈出一個內(nèi)容為“哈哈”的警告框队萤。
[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"function showMessageAction(){alert('哈哈');}"]];

那么JavaScript就直接調(diào)用window.showMessageAction()就可以調(diào)用這個方法啦。通過這樣的方式矫钓,我們不但可以定義JavaScritp函數(shù)要尔、執(zhí)行JavaScritp函數(shù)舍杜,也可以傳遞數(shù)據(jù)(直接返回就行啦)。由于android的addJavascriptInterface()方法中有兩個參數(shù)赵辕,若第二個參數(shù)傳入字符串既绩,比如test,則JS的調(diào)用需要更改為 window.test.showMessageAction()。為了使IOS與android的調(diào)用保持一致还惠,則需要對js進(jìn)行修改饲握,具體修改形式:

[webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"var test = {}; (function initialize()  {    test.showMessageAction = function showMessageAction(){ alert('哈哈');    };   })()"]];

這樣在IOS環(huán)境下JS也可以通過調(diào)用 window.test.showMessageAction()來獲取用戶名了。

JavaScript調(diào)用oc代碼

Simulator Screen Shot 2016年11月13日 下午10.41.54.png

在JavaScriptCore出現(xiàn)之前蚕键,似乎沒有專門的API來做這件事救欧,但是還是可以通過一些辦法來達(dá)到此目的。這里討論的實(shí)現(xiàn)思想是通過對UIWebView的delegate方法
-(BOOL)webView: shouldStartLoadWithRequest: navigationType:
進(jìn)行處理來實(shí)現(xiàn)的锣光。劫持UIWebview所加載的url來判斷是否是需要處理的條件即可笆怠。

  • 首先我們定義一種URL格式:
    協(xié)議名:函數(shù)名?參數(shù)1&參數(shù)2&……
  • 接著在JavaScript中調(diào)用一個如下方法:
document.location = "協(xié)議名:函數(shù)名?參數(shù)1&參數(shù)2&……";
  • 最后在UIWebView監(jiān)聽加載的URL,并就此作出相應(yīng)的操作誊爹。

例如:

  • 先在html中寫一個如下的按鈕:
    <button type="button" name="btn2" id="btn2" value="提示" onclick="javaScript:button2Action();">js調(diào)用OC彈出框</button>
  • 接著寫一個如下JavaScript函數(shù):
function button2Action()
{
    document.location = "test:showAlertView?提示&OC彈出框&確定";
}
  • 最后對UIWebView的delegate方法
    -(BOOL)webView: shouldStartLoadWithRequest: navigationType:
    進(jìn)行處理:
-(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    // 處理事件
    NSString *requestString = [[[request URL] absoluteString] stringByRemovingPercentEncoding];
    NSLog(@"%@", requestString);
    NSArray *requestsArr = [requestString componentsSeparatedByString:@":"];
    if (requestsArr != nil && [requestsArr count] > 0) {
        NSString *pocotol = [requestsArr objectAtIndex:0];
        if ([pocotol isEqualToString:@"test"]) {
            NSString *commandStr = [requestsArr objectAtIndex:1];
            NSArray *commandArr = [commandStr componentsSeparatedByString:@"?"];
            if (commandArr != nil && [commandArr count] > 0) {
                NSString *command = [commandArr objectAtIndex:0];
                NSString *parameterStr = [commandArr objectAtIndex:1];
                NSArray *parameterArray = [parameterStr componentsSeparatedByString:@"&"];
                if ([command isEqualToString:@"showAlertView"]) {
                    NSString *title;
                    NSString *message;
                    NSArray *otherButtonTitles;
                    if (parameterArray && parameterArray.count > 0) {
                        title = parameterArray[0];
                    }
                    if (parameterArray && parameterArray.count > 1) {
                        message = parameterArray[1];
                    }
                    if (parameterArray && parameterArray.count > 2) {
                        otherButtonTitles = [parameterArray subarrayWithRange:NSMakeRange(2, parameterArray.count - 2)];
                    }
                    UIAlertController *alertController = [UIAlertController alertControllerWithTitle:title message:message preferredStyle:UIAlertControllerStyleAlert];
                    UIAlertAction *alertAction;
                    for (NSString *buttonTitle in otherButtonTitles) {
                        alertAction = [UIAlertAction actionWithTitle:buttonTitle style:UIAlertActionStyleDefault handler:nil];
                        [alertController addAction:alertAction];
                    }
                    
                    [self presentViewController:alertController animated:YES completion:nil];
                }
            }
            
            return NO;
        }
    }
    
    return YES;
}

通過這樣的方式來做交互骑疆,需要iOS程序員和前端程序員協(xié)商好它們之間的關(guān)系,總體說來還是比較麻煩的替废。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末箍铭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椎镣,更是在濱河造成了極大的恐慌诈火,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件状答,死亡現(xiàn)場離奇詭異冷守,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)惊科,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門拍摇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人馆截,你說我怎么就攤上這事充活。” “怎么了蜡娶?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵混卵,是天一觀的道長。 經(jīng)常有香客問我窖张,道長幕随,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任宿接,我火速辦了婚禮赘淮,結(jié)果婚禮上辕录,老公的妹妹穿的比我還像新娘。我一直安慰自己梢卸,他們只是感情好走诞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著低剔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪肮塞。 梳的紋絲不亂的頭發(fā)上襟齿,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機(jī)與錄音枕赵,去河邊找鬼猜欺。 笑死,一個胖子當(dāng)著我的面吹牛拷窜,可吹牛的內(nèi)容都是我干的开皿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼篮昧,長吁一口氣:“原來是場噩夢啊……” “哼赋荆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起懊昨,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤窄潭,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后酵颁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嫉你,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年躏惋,在試婚紗的時候發(fā)現(xiàn)自己被綠了幽污。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡簿姨,死狀恐怖距误,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情扁位,我是刑警寧澤深寥,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贤牛,受9級特大地震影響惋鹅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜殉簸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一闰集、第九天 我趴在偏房一處隱蔽的房頂上張望沽讹。 院中可真熱鬧,春花似錦武鲁、人聲如沸爽雄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽挚瘟。三九已至,卻和暖如春饲梭,著一層夾襖步出監(jiān)牢的瞬間乘盖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工憔涉, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留订框,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓兜叨,卻偏偏與公主長得像穿扳,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子国旷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容