/*
原生页面优势:(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;
//}