iOS原生和H5的相互调用

/*

原生页面优势:(1)运行速度比较快(2)能使用设备的底层功能,如摄像头、方向传感器、重力传感器、拨号、GPS、语音、短信、蓝牙等(3)在界面设计、功能模块、操作逻辑等层面相较web更易

做到App的便捷性和舒适性,功能更加强大(4)节省流量

劣势:(1)不同的操作系统(如Android和iOS)需要独立的进行开发,使用其各自的开发包、开发工具和控件(2)每次有更新,都需要重新打包一次发布到应用平台上,且每次要向各个应用商店进行

提交审核。之后用户需要手动进行点击更新安装(安装成本较高)(3)开发成本比较高,尤其需要适配各种机型时(如Android应用,需要适配各种Android手机)

H5页面优势:(1)由于是运行在浏览器上,所以只需要开发一次便可以在不同的操作系统上显示(2)迭代版本时,不需要打包便可以发布(实时更新、快速迭代),与云端实现实时数据交互(3)开发

成本相对较低,对浏览器的适配较简单,且发布门槛相对较低

劣势:(1)每次打开页面,都得重新加载,获取数据...(2)过于依赖网络,速度无法保证。特别在弱网环境下,不仅耗费流量而且加载缓慢,就算是WiFi情况下也不容乐观(3)只能使用有限的设备底

层功能(无法使用摄像头、方向传感器、重力传感器、拨号、GPS、语音、短信、蓝牙等功能)(4)仍处于发展阶段,部分功能无法在基于现有技术的浏览器基础上实现,且无法全面的显示最完美的用户

体验,只能用现有技术去弥去找最佳解决方案

*/

/* 原生与H5的相互调用,其实也可以简单理解为Webview跟JavaScript的相互调用。 */

第一种方法:

//网页加载完调用js弹窗


//JS调用webview

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{

//自定义协议与OC进行交互    // 网页上的一个链接,点击这个链接出发以下反应。。。1) {

if ([pathComponents[1] isEqualToString:@"news"]) {

SEL method = sel_registerName([pathComponents[1] UTF8String]);

if ([self respondsToSelector:method]) {

[self performSelector:method withObject:@"123"];

}

[self showMessage:@"123"];

}

}

/*

if (pathComponents.count>1) {

if ([pathComponents[1] isEqualToString:@"news"]) {

[self showMessage:@"123"];

}

}

方便大家私下调试用

*/

if ([request.URL.scheme isEqualToString:@"protocol"]) {

//调用oc的方法做事

NSLog(@"pathComponents---%@",pathComponents);

//获取到方法名的字符串

NSString *methodName = pathComponents[1];//之所以是从下标1开始取,是因为数组pathComponents为<__NSArrayM 0x60000044b4f0>(

//        /,

//        news

//        )  0的位置为换行符

//获取到的参数的字符串

NSString *param= pathComponents[2];//数组第二个元素为方法的参数

//SEL

//        SEL method = NSSelectorFromString(methodName);

SEL method = sel_registerName([methodName UTF8String]);

//调用方法

if ([self respondsToSelector:method]) {

[self performSelector:method withObject:param];

}

return NO;

}

return YES;

}


- (void)news{

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// Do time-consuming task in background thread

// Return back to main thread to update UI

dispatch_sync(dispatch_get_main_queue(), ^{

ViewController2* v2 = [[ViewController2 alloc]init];

[v2 setSelectedRoomBlock:^(NSString *name) {

NSLog(@"%@",name);

//                [self performSelector:@selector(didBegin) withObject:nil afterDelay:1];

}];

[self.navigationController pushViewController:v2 animated:YES];

});

});

}

- (void)showMessage:(NSString *)param{

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

// Do time-consuming task in background thread

// Return back to main thread to update UI

dispatch_sync(dispatch_get_main_queue(), ^{

ViewController2* v2 = [[ViewController2 alloc]init];

[v2 setSelectedRoomBlock:^(NSString *name) {

NSLog(@"%@",name);

//                [self performSelector:@selector(didBegin) withObject:nil afterDelay:1];

}];

[self.navigationController pushViewController:v2 animated:YES];

});

});

}

第二种方法

:在需要交互的页面,写一个定时器,高频率去JS调用,这种方法个人觉得比第一种方法更加高效。因为他会比第一种方法被触发的更快。

//- (void)viewWillAppear:(BOOL)animated{

//    [super viewWillAppear:animated];

//

//    if (self.timer) {

//

//        self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1f target:self selector:@selector(doRequest) userInfo:nil repeats:YES];

//    }

//}

//- (void)viewWillDisappear:(BOOL)animated{

//    [super viewWillDisappear:animated];

//    [_timer invalidate];

//    self.timer = nil;

//}

//

//#pragma mark -----使用对接接口的形式---这样可以使JS交互更加快捷

//- (void)doRequest{

//

//    NSString* strInterFaceObject = [self.myWebView stringByEvaluatingJavaScriptFromString:@"getEventCode"];

//    NSString* evenCode = @"getEventCode";//需要与前端协商好

//    NSString* eventName = @"";//需要与前端协商好

//    if ([strInterFaceObject isKindOfClass:[NSString class]]) {

//

//        id test = [strInterFaceObject JSONValue];//对报文的处理

//        if (test &&[test isKindOfClass:[NSDictionary class]]) {

//            NSDictionary *interface = (NSDictionary *)test;

//            evenCode =[interface objectForKey:@"code"];

//            eventName = [interface objectForKey:@"name"];

//        }else{

//            evenCode = [self getEventCode];

//            eventName = [self getEventName];

//        }

//        //eventCode不为nil,不为空,不为0

//        if (evenCode !=nil && ![evenCode isEqualToString:@""] && ![evenCode isEqualToString:@"0"]) {

//

//            /*事先把需要调用的方法加入到一个数组,并在此进行循环,如果是要调用的方法就去调用响应的方法*/

////            for (HandCode *handCode in self.arrayHandCodes) {

////                if ([handCode.code isEqualToString:eventCode]) {

//              SEL method = sel_registerName([eventName UTF8String]);

//            if ([self respondsToSelector:method]) {

//                [self performSelector:method withObject:eventName];

//            }

//

//

////                    break;

////                }

////            }

//        }

//    }

//

//

//}

////获取对接接口"代码"

//-(NSString *)getEventCode{

//    NSString *code =  [self.myWebView stringByEvaluatingJavaScriptFromString:@"getEventCode"];

//    return code;

//}

////获取对接接口"名称"

//-(NSString *)getEventName{

//    NSString *eventName =  [self.myWebView stringByEvaluatingJavaScriptFromString:@"getEvent"];

//

//    return eventName;

//}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容