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;

//}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容