Js與OC交互

源碼請(qǐng)點(diǎn)擊github地址下載。

下面講述實(shí)現(xiàn)OC和JS的交互会通,它們相互調(diào)用称龙,其中需要寫一個(gè)靜態(tài)的HTML文件用于提供JS方法。

效果圖如下:

screen.png



一.OC調(diào)用JS:

不說閑話因篇,看代碼如下

  • 需要先在js文件定義方法postStr供oc調(diào)用
  function postStr(string) {
        return 'I am the return parameter JS, and param ' + string;
    }
  • oc代碼只需一句即可調(diào)用
  NSString *str = [self.webView stringByEvaluatingJavaScriptFromString:@"postStr('ocToJs')"];
  //輸出str為I am the return parameter JS, and param ocToJs泞辐,正式j(luò)s中postStr方法的返回值。
需注意的是正確書寫@"postStr('ocToJs')"的格式惜犀,postStr為js方法铛碑,ocToJs是OC傳遞給JS的參數(shù)。

二.JS調(diào)用OC:

  • 在h5頁(yè)面添加了了button元素虽界,用于觸發(fā)js方法jsCallOCClicked
  <button onclick="jsCallOCClicked()">
    <h1>jsCallOC</h1>
  </button>
  • 在js文件的jsCallOCClicked()方法中去調(diào)用OC的jsCallToOC()方法
  function jsCallOCClicked() {
        window.location.href = "objc://jsCallToOC#param#github地址#param#https://github.com/SoftProgramLX/OcAndJs";
    }
說明:<br>
1.“objc://”為自定義的OC識(shí)別JS調(diào)用的標(biāo)識(shí)<br>
2.“jsCallToOC”為需調(diào)用的OC方法<br>
3.“#param#”為自定義的方法與參數(shù)或參數(shù)與參數(shù)的分隔符<br>
4.“github地址”為js傳遞給OC的第一個(gè)參數(shù)<br>
5.“https://github.com/SoftProgramLX/OcAndJs”為js傳遞給OC的第二個(gè)參數(shù)<br>
  • 實(shí)現(xiàn)OC的jsCallToOC()方法
- (void)jsCallToOC:(NSArray *)params
{
    dataArr = params;
    alertV = [[UIAlertView alloc] initWithTitle:@"js已經(jīng)調(diào)用了OC方法" message:@"查看控制臺(tái)的信息汽烦,點(diǎn)擊取消會(huì)再觸發(fā)OC調(diào)用js" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"確定", nil];
    alertV.tag = 9666;
    [alertV show];
    
    NSLog(@"js調(diào)用OC返回值:%@", params);
}
這里params[0]輸出是github地址,params[1]輸出是https://github.com/SoftProgramLX/OcAndJs
  • 關(guān)鍵所在

    目前JS調(diào)用OC的jsCallToOC()方法還不會(huì)觸發(fā)莉御,當(dāng)點(diǎn)擊h5頁(yè)面的按鈕時(shí)只會(huì)觸發(fā)OC的- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;這個(gè)方法撇吞。

    需在這個(gè)方法里解析request參數(shù)的URL值俗冻,解析后path的值就是"objc://jsCallToOC#param#github地址#param#https://github.com/SoftProgramLX/OcAndJs",再繼續(xù)分解出里面的方法與參數(shù)牍颈,然后執(zhí)行[self performSelector:todoM withObject:params afterDelay:0];代碼才能觸發(fā)OC的jsCallToOC()方法迄薄。

    代碼如下:
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    NSString *path =  [[request URL] absoluteString];
    if ([[UIDevice currentDevice].systemVersion doubleValue] >= 7.0) {
        path = [path stringByRemovingPercentEncoding];
    }else{
        path = [path stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    }
    
    if ([path hasPrefix:@"ios"]||[path hasPrefix:@"objc"]) {
        NSString *method = [path substringFromIndex:@"objc://".length];
        NSArray *sels = [method componentsSeparatedByString:@"#param#"];
        SEL todoM;
        if (sels.count>1) {
            todoM = NSSelectorFromString([NSString stringWithFormat:@"%@:",sels[0]]);
            NSMutableArray *params = [NSMutableArray array];
            for (int i=1; i<sels.count; i++) {
                [params addObject:sels[i]];
            }
            if ([self respondsToSelector:todoM]) {
                [self performSelector:todoM withObject:params afterDelay:0];
            }
        }else if(sels.count==1){
            todoM = NSSelectorFromString([NSString stringWithString:sels[0]]);
            if ([self respondsToSelector:todoM]) {
                [self performSelector:todoM withObject:nil afterDelay:0];
            }
        }
        return NO;
    }
    
    return YES;
}
說明:<br>
這里判斷sels.count>1的目的是判斷有無(wú)傳參<br>
若無(wú)參數(shù)則定義方法- (void)jsCallToOC;<br>
若有參數(shù)則定義方法- (void)jsCallToOC:(NSArray *)params煮岁。

三.額外方法

  • 禁止復(fù)制網(wǎng)頁(yè)文字
- (void)deletePrompt
{
    [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitUserSelect='none';"];
    [self.webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.style.webkitTouchCallout='none';"];
}
  • 用于js統(tǒng)計(jì)
- (void)jsStatistics
{
    NSString *systemUserAgent = [self.webView stringByEvaluatingJavaScriptFromString:@"navigator.userAgent"];
    
    if (!([systemUserAgent rangeOfString:@"****-app-iphone Version/"].length > 0)) {
        NSString *currentVersion = [NSBundle mainBundle].infoDictionary[(__bridge NSString *)kCFBundleVersionKey];
        systemUserAgent = [systemUserAgent stringByAppendingFormat:@" ***-app-iphone Version/%@", currentVersion];
    }
    
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:systemUserAgent, @"UserAgent", nil];
    [[NSUserDefaults standardUserDefaults] registerDefaults:dictionary];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末讥蔽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子画机,更是在濱河造成了極大的恐慌冶伞,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件步氏,死亡現(xiàn)場(chǎng)離奇詭異响禽,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)荚醒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門芋类,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人界阁,你說我怎么就攤上這事侯繁。” “怎么了泡躯?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵巫击,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我精续,道長(zhǎng),這世上最難降的妖魔是什么粹懒? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任重付,我火速辦了婚禮,結(jié)果婚禮上凫乖,老公的妹妹穿的比我還像新娘确垫。我一直安慰自己,他們只是感情好帽芽,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布删掀。 她就那樣靜靜地躺著,像睡著了一般导街。 火紅的嫁衣襯著肌膚如雪披泪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天搬瑰,我揣著相機(jī)與錄音款票,去河邊找鬼控硼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛艾少,可吹牛的內(nèi)容都是我干的卡乾。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼缚够,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼幔妨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谍椅,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤误堡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后毯辅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體埂伦,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年思恐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了沾谜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胀莹,死狀恐怖基跑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情描焰,我是刑警寧澤媳否,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站荆秦,受9級(jí)特大地震影響篱竭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜步绸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一掺逼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧瓤介,春花似錦吕喘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至祠斧,卻和暖如春闻察,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工蜓陌, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留觅彰,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓钮热,卻偏偏與公主長(zhǎng)得像填抬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子隧期,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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