热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈UIWebView,HTML5与Native的混合开发

今天在做项目的时候,遇到了UIWebView的问题,所以今天顺便总结一下,同时也简单的谈了一下Native与H5的混合开发,关于混合开发这块,研究的不算太好,希望广大博友指正~~网络开发中,当公司已经使用HTML5技术实现同时适应Android和iOS等多个平台的网页时,这时往往需要我们iOS平台能够嵌入网页并进行各种交互,这里我们考虑的方案就是:使用U

今天在做项目的时候,遇到了UIWebView的问题,所以今天顺便总结一下,同时也简单的谈了一下Native与H5的混合开发,关于混合开发这块,研究的不算太好,希望广大博友指正~~

网络开发中,当公司已经使用 HTML5 技术实现同时适应 Android 和 iOS 等多个平台的网页时,这时往往需要我们 iOS 平台能够嵌入网页并进行各种交互,

这里我们考虑的方案就是:使用 UIWebView 网页控件

UIWebView是苹果给我们提供展示网页的一种控件。

UIWebView的基本用法

我们一般这样创建并加载一个服务器端的网页:

-(UIWebView *)webview
{
    if (!_webview) {
        
        _webview = [[UIWebView alloc] init];
        _webview.scalesPageToFit = YES;
        _webview.delegate = self;
        
        NSURL *url =[NSURL URLWithString:self.urlString];
        NSURLRequest *request =[NSURLRequest requestWithURL:url];
        [_webview loadRequest:request];

    }
    return _webview;
}

像这样加载一个本地网页:

- (UIWebView *)webView
{
    if (!_webView) {
        
        _webView = [[UIWebView alloc] init];
        _webView.scalesPageToFit = YES;
        _webView.delegate = self;
        
        NSString *resourcePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/LocalWeb"];
        NSString *filePath = [resourcePath stringByAppendingPathComponent:@"index.html"];
        NSString *htmlstring=[[NSString alloc] initWithContentsOfFile:filePath  encoding:NSUTF8StringEncoding error:nil];
        [_webView loadHTMLString:htmlstring baseURL:[NSURL fileURLWithPath:resourcePath]];
    }
    return _webView;
}

iOS Native 与 HTML5 之间的交互

Html5的有很多优点,比如开发速度快,app上线也可以随意修改免审核,跨平台,效果也不错。第一次听说这个混合式开发还是自己在钻研UIWebView的时候,那个时候才知道这样开发也是有很多合适的地方的。Cordova和它的前身PhoneGap,国内的WebViewJavascriptBridge都是很好的混合开发解决方案。如果传递的参数比较简单,功能不复杂的话,不用三方也可以很容易的实现。

Objective-C 调用 Javascript

可以使用webview调用如下代码:

- (NSString *)stringByEvaluatingJavascriptFromString:(NSString *)script;

这个方法向UIWebView传递一段需要执行的Javascript代码最后获取执行结果。

比如做百思不得姐那个项目时,我需要点击Native的button获取网页上的文字,用来当邮件内容:

//getEmailContent();就是js的方法名
//body就是getEmailContent方法返回的文字信息

NSString * body =[self.webView stringByEvaluatingJavascriptFromString:@"getEmailContent();"];

Javascript 调用 Objective-C

实现点击网页上的按钮,调用原生的方法需要用到webview的一个代理:

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

详细说一下调用流程:

点击按钮要JS发送像这样 yuefan://jump?invitingID=1 的一条协议给 native app,

然后app通过代理收到这个协议,就可以根据协议调用自身的方法了。

举个栗子:

App端

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
    NSURL * url = [request URL];
    if ([[url scheme] isEqualToString:@"yuefan"]) {
        if ([[url host] isEqualToString:@"jump"]) {
            
            ShopDetailViewController * issuedVC = [[ShopDetailViewController alloc] init];
            issuedVC.shopID = [[url valueForParameter:@"shopID"] intValue];
            [self.navigationController pushViewController:issuedVC animated:YES];
        }
    }
    
    return YES;
}

Html端

    
        "content-type" cOntent="text/html;charset=utf-8" />
        
    
    
        "yuefan://jump?invitingID=1">点击发送
    

 


推荐阅读
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • Voicewo在线语音识别转换jQuery插件的特点和示例
    本文介绍了一款名为Voicewo的在线语音识别转换jQuery插件,该插件具有快速、架构、风格、扩展和兼容等特点,适合在互联网应用中使用。同时还提供了一个快速示例供开发人员参考。 ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • C#多线程解决界面卡死问题的完美解决方案
    当界面需要在程序运行中不断更新数据时,使用多线程可以解决界面卡死的问题。一个主线程创建界面,使用一个子线程执行程序并更新主界面,可以避免卡死现象。本文分享了一个例子,供大家参考。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文讨论了Alink回归预测的不完善问题,指出目前主要针对Python做案例,对其他语言支持不足。同时介绍了pom.xml文件的基本结构和使用方法,以及Maven的相关知识。最后,对Alink回归预测的未来发展提出了期待。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了在SpringBoot中集成thymeleaf前端模版的配置步骤,包括在application.properties配置文件中添加thymeleaf的配置信息,引入thymeleaf的jar包,以及创建PageController并添加index方法。 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 在Windows10系统上使用VMware创建CentOS虚拟机的详细步骤教程
    本文详细介绍了在Windows10系统上使用VMware创建CentOS虚拟机的步骤,包括准备条件、安装VMware、下载CentOS ISO文件、创建虚拟机并进行自定义配置、设置虚拟机的ISO与网络、进行安装和配置等。通过本文的指导,读者可以轻松地创建自己的CentOS虚拟机并进行相应的配置和操作。 ... [详细]
  • 判断编码是否可立即解码的程序及电话号码一致性判断程序
    本文介绍了两个编程题目,一个是判断编码是否可立即解码的程序,另一个是判断电话号码一致性的程序。对于第一个题目,给出一组二进制编码,判断是否存在一个编码是另一个编码的前缀,如果不存在则称为可立即解码的编码。对于第二个题目,给出一些电话号码,判断是否存在一个号码是另一个号码的前缀,如果不存在则说明这些号码是一致的。两个题目的解法类似,都使用了树的数据结构来实现。 ... [详细]
author-avatar
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有