UIWebView加載頁(yè)面與iOS簡(jiǎn)單的相互調(diào)用

1.HTML調(diào)用iOS中的方法

方法一:通過(guò)攔截點(diǎn)擊方法的href.(你可以這樣理解:點(diǎn)擊網(wǎng)頁(yè)中的一個(gè)按鈕跳轉(zhuǎn)到百度首頁(yè),其實(shí)這個(gè)按鈕的href屬性就是)
//在webView的代理方法中根據(jù)URL來(lái)判斷是否需要調(diào)用iOS中的方法
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
    NSLog(@"%@", request.URL.absoluteString);
    // HTML中跳轉(zhuǎn)第美,事件等操作都會(huì)攜帶一個(gè)URL蝶锋,并且在這里都會(huì)截取到。和前端同事商量共同規(guī)定這一協(xié)議(當(dāng)然可以隨意)
    NSString *str = request.URL.absoluteString;
 // @"ecm:///openCamera"
    NSRange range = [str rangeOfString:@"ecm:///"];
    NSUInteger location = range.location;
    if (location != NSNotFound) {// 取到指定的協(xié)議頭時(shí)執(zhí)行相應(yīng)的方法
        NSString *method = [str substringFromIndex:location + range.length];
        SEL sel = NSSelectorFromString(method);
        [self performSelector:sel];
    }
    
    return YES;
}
方法二:JSExport 協(xié)議關(guān)聯(lián) native對(duì)象什往,進(jìn)而調(diào)用對(duì)象協(xié)議中約定的方法

需求描述:在A控制器扳缕,當(dāng)點(diǎn)擊一個(gè)按鈕后跳轉(zhuǎn)到B控制器,B控制器通過(guò)UIWebView加載一個(gè)后端用js寫好的頁(yè)面别威。此時(shí)躯舔,我們?cè)邳c(diǎn)擊頁(yè)面上的關(guān)閉按鈕返回到我們的A控制器。
分析:A控制器是我們客戶端寫的省古,而B控制器雖然是我們寫的庸毫,但是加載的網(wǎng)頁(yè)不是我們寫的,所在在點(diǎn)擊網(wǎng)頁(yè)上的按鈕時(shí)衫樊,就需要調(diào)用我們OC的方法來(lái)實(shí)現(xiàn)返回到A控制器飒赃。
//
//  VertyCodeController.h
//  Ecm
//
//  Created by zengchunjun on 16/10/26.
//
#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>
// 定義一個(gè)遵循JSExport協(xié)議的協(xié)議。方法名必須與js調(diào)用的方法名一致科侈,下面是我實(shí)際工作中的一個(gè)簡(jiǎn)單需求载佳。若帶有參數(shù)的方法,則我們定義的協(xié)議的方法可以隨意拆分但是組合在一起也必須和js調(diào)用的方法名一致
@protocol vertyCodeJSProtocol <JSExport>

- (void)closeView;

@end

@interface VertyCodeController : UIViewController

@end

//
//  VertyCodeController.m
//  Ecm
//
//  Created by zengchunjun on 16/10/26.
//
//

#import "VertyCodeController.h"
#import "Util.h"
#import "LoginView.h"

// 遵守定義的協(xié)議臀栈,實(shí)現(xiàn)相應(yīng)的方法蔫慧。
@interface VertyCodeController ()<UIWebViewDelegate,vertyCodeJSProtocol>

@property (nonatomic,weak)UIWebView *webView;
@property (nonatomic,strong)JSContext *context;
@end

@implementation VertyCodeController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view   
    self.view.backgroundColor = [UIColor whiteColor];
    self.title = @"登錄驗(yàn)證";
    
    UIWebView *webView = [UIWebView new];
    webView.frame = self.view.frame;
    self.webView = webView;
    self.webView.delegate = self;
    [self.view addSubview:self.webView];
    
    NSString *codeUrl =  @"需要打開(kāi)的網(wǎng)頁(yè)"; // [Util getMessage_register_code_url];
    NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:url]];
    [self.webView loadRequest:request];
    
}


- (void)closeView
{
    [LoginView Instance].stateText.text = @"驗(yàn)證通過(guò),請(qǐng)重新登錄";
    [self dismissViewControllerAnimated:YES completion:nil];
}

- (void)webViewDidFinishLoad:(UIWebView *)webView
{
    // JSExport 協(xié)議關(guān)聯(lián) native對(duì)象权薯,進(jìn)而調(diào)用對(duì)象協(xié)議中約定的方法
    // 獲取該UIWebview的javascript執(zhí)行環(huán)境姑躲。
    self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
// 異常處理
    self.context.exceptionHandler =
    ^(JSContext *context, JSValue *exceptionValue)
    {
        context.exception = exceptionValue;
        NSLog(@"%@", exceptionValue);
    };
// 其實(shí)服務(wù)端在點(diǎn)擊關(guān)閉按鈕時(shí)調(diào)用的方法就是 ecm.closeView()
// 帶一個(gè)參數(shù)ecm.returnOneParame(str),則我們協(xié)議中定義的方法就需要寫成 - (void)returnoneparamwe:(NSString *)str
// 帶兩個(gè)參數(shù)ecm.returnfirstsecond(str1,str2),則我們協(xié)議中定義的方法就需要寫成 - (void)returnfirst:(NSString *)str1 second:(NSString *)str2;總結(jié)盟蚣,方法名保持一致

    self.context[@"ecm"] = self;
}

@end

//實(shí)現(xiàn)訪問(wèn)相冊(cè)
- (void)openCamera{
    UIImagePickerController *pickerVC = [[UIImagePickerController alloc] init];
    pickerVC.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
    [self presentViewController:pickerVC animated:YES completion:nil];
}

2.當(dāng)HTML調(diào)用iOS中方法后黍析,一般會(huì)傳數(shù)據(jù)給服務(wù)端,這時(shí)就需要iOS調(diào)用HTML的方法
iOS 中調(diào)用HTML的方法用stringByEvaluatingJavaScriptFromString

// js交互屎开,oc調(diào)用js方法
- (void)passValues:(NSArray *)list
{
//根據(jù)服務(wù)端的數(shù)據(jù)格式要求整理數(shù)據(jù)
    NSMutableArray *dataArray = [NSMutableArray array];
    for (int i = 0; i < list.count; i++) {
        Contact *contact = list[i];
        NSString *account = contact.account;
        [dataArray addObject:account];
    }
    
    NSDictionary *dataDic = @{@"data":dataArray,@"message":@"調(diào)用成功",@"status":@0};
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dataDic options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
// 直接調(diào)用HTML的方法括號(hào)內(nèi)是需要傳遞的參數(shù)
    [self.webView stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"selectedUsersComplete(%@)",jsonStr]];
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末阐枣,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蔼两,老刑警劉巖甩鳄,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異额划,居然都是意外死亡妙啃,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門俊戳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)揖赴,“玉大人,你說(shuō)我怎么就攤上這事品抽〈⑿Γ” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵圆恤,是天一觀的道長(zhǎng)突倍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)盆昙,這世上最難降的妖魔是什么羽历? 我笑而不...
    開(kāi)封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮淡喜,結(jié)果婚禮上秕磷,老公的妹妹穿的比我還像新娘。我一直安慰自己炼团,他們只是感情好澎嚣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著瘟芝,像睡著了一般易桃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锌俱,一...
    開(kāi)封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天晤郑,我揣著相機(jī)與錄音,去河邊找鬼贸宏。 笑死造寝,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吭练。 我是一名探鬼主播诫龙,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼线脚!你這毒婦竟也來(lái)了赐稽?” 一聲冷哼從身側(cè)響起叫榕,我...
    開(kāi)封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浑侥,失蹤者是張志新(化名)和其女友劉穎姊舵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體寓落,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡括丁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了伶选。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片史飞。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖仰税,靈堂內(nèi)的尸體忽然破棺而出构资,到底是詐尸還是另有隱情,我是刑警寧澤陨簇,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布吐绵,位于F島的核電站,受9級(jí)特大地震影響河绽,放射性物質(zhì)發(fā)生泄漏己单。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一耙饰、第九天 我趴在偏房一處隱蔽的房頂上張望纹笼。 院中可真熱鬧,春花似錦苟跪、人聲如沸廷痘。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)笋额。三九已至,卻和暖如春拨齐,著一層夾襖步出監(jiān)牢的瞬間鳞陨,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工瞻惋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留厦滤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓歼狼,卻偏偏與公主長(zhǎng)得像掏导,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羽峰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)趟咆、插件添瓷、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,107評(píng)論 4 62
  • fdlso閱讀 93評(píng)論 0 0
  • “祭司說(shuō)你是河神的新娘,你要出嫁了吧值纱,好可惜” “哎鳞贷,河神啊,我哪里好了虐唠,你就看上了我這樣個(gè)鄉(xiāng)下野丫頭搀愧,哎,命啊”...
    溱洧川閱讀 335評(píng)論 0 1
  • 煙雨迷蒙繞九州疆偿,柳枝搖曳攬清風(fēng)咱筛。 悠揚(yáng)流水環(huán)郭繞,鳥雀雞鳴報(bào)曉愁杆故。 青衫羅袖戲文里迅箩,說(shuō)書人唱臺(tái)上戲。 誰(shuí)人門前春一...
    藏淮聲閱讀 694評(píng)論 2 7
  • 城市的燈火闌珊,孤單的你落寞…… 你曾幻想過(guò)自己的未來(lái)嗎处铛? 你曾有過(guò)執(zhí)著要堅(jiān)持的夢(mèng)嗎饲趋? 你曾不顧一切想要逃離不喜歡...
    飛飛是我呀閱讀 272評(píng)論 0 0