swift 原生给h5发消息_Swift - 使用HTML5进行iOS开发(将HTML5打包成iOS应用)

下面简单介绍下如何把HTML5编写的页面编译成iOS应用,以及如何让页面与Swift代码进行交互。(本文代码已升级至Swift3)

1,使用UIWebView还是WKWebView来加载html页面

原来我们一直使用UIWebView来加载web页面。从iOS8起,苹果提供了WKWebView用来代替UIWebView。

虽然WKWebView不支持缓存和NSURLProtocol 拦截了,但其加载速度比UIWebView提升差不多一倍的, 内存使用上面反而还少了一半。同时也增加了加载进度条属性,而不像原来要使用假的进度条。原生代码与页面js互相调用也更加方便。

所有在缓存要求不高的情况下,建议使用WKWebView,用户体验也会更好。

2,使用UIWebView和WKWebView加载html页面

我们可以整个应用都使用HTML5来编写,或者只有某几个页面使用HTML。

先把HTML5的页面导入到项目中来,然后再使用UIWebView或WKWebView加载显示。(除了导入到本地工程里,把html页面放在服务器上远程加载也是可以的)

(注意:添加文件的时候有两种方式:“Create groups”和“Create folder references”。如果你的html页面有层次结构,比如css,js,图片都放在各自的子文件夹中。要选择后面那个方式“Create folder references”。如果选第一个,虽然在Xcode组织树看来都是好的,但实际所有加入到项目的文件都会在mainBundle根路径下,这样文件引用就会出问题。)

(1)下面是使用UIWebView的样例:

import UIKit

import WebKit

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

let path = Bundle.main.path(forResource: "index", ofType: ".html",

inDirectory: "HTML5")

let url = URL(fileURLWithPath:path!)

let request = URLRequest(url:url)

//将浏览器视图全屏(在内容区域全屏,不占用顶端时间条)

let frame = CGRect(x:0, y:20, width:UIScreen.main.bounds.width,

height:UIScreen.main.bounds.height)

let theWebView = UIWebView(frame:frame)

//禁用页面在最顶端时下拉拖动效果

theWebView.scrollView.bounces = false

//加载页面

theWebView.loadRequest(request)

self.view.addSubview(theWebView)

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

}

(2)下面是使用WKWebView的样例:

import UIKit

import WebKit

class ViewController: UIViewController {

override func viewDidLoad() {

super.viewDidLoad()

let path = Bundle.main.path(forResource: "index", ofType: ".html",

inDirectory: "HTML5")

let url = URL(fileURLWithPath:path!)

let request = URLRequest(url:url)

//将浏览器视图全屏(在内容区域全屏,不占用顶端时间条)

let frame = CGRect(x:0, y:20, width:UIScreen.main.bounds.width,

height:UIScreen.main.bounds.height)

let theWebView:WKWebView = WKWebView(frame:frame)

//禁用页面在最顶端时下拉拖动效果

theWebView.scrollView.bounces = false

//加载页面

theWebView.load(request)

self.view.addSubview(theWebView)

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

}

3,swift代码与页面js互相调用(使用WKWebView)

下面通过一个简单样例演示js与原生代码如何进行相互调用以及参数传递。当点击一个商品图片时,会弹出一个iOS的消息框。当用户选择确定后,又会调用页面js方法,把商品添加到购物车里面。

--- Swift代码 ViewController.swift ---

import UIKit

import WebKit

class ViewController: UIViewController, WKScriptMessageHandler{

var theWebView:WKWebView?

override func viewDidLoad() {

super.viewDidLoad()

let path = Bundle.main.path(forResource: "index", ofType: ".html",

inDirectory: "HTML5")

let url = URL(fileURLWithPath:path!)

let request = URLRequest(url:url)

//创建供js调用的接口

let theConfiguration = WKWebViewConfiguration()

theConfiguration.userContentController.add(self, name: "interOp")

//将浏览器视图全屏(在内容区域全屏,不占用顶端时间条)

let frame = CGRect(x:0, y:20, width:UIScreen.main.bounds.width,

height:UIScreen.main.bounds.height)

theWebView = WKWebView(frame:frame, configuration: theConfiguration)

//禁用页面在最顶端时下拉拖动效果

theWebView!.scrollView.bounces = false

//加载页面

theWebView!.load(request)

self.view.addSubview(theWebView!)

}

//响应处理js那边的调用

func userContentController(_ userContentController:WKUserContentController,

didReceive message: WKScriptMessage) {

print(message.body)

let sentData = message.body as! Dictionary

//判断是确认添加购物车操作

if(sentData["method"] == "addToCarCheck"){

//获取商品名称

let itemName = sentData["name"]!

let alertController = UIAlertController(title: "系统提示",

message: "确定把\(itemName)添加到购物车吗?",

preferredStyle: .alert)

let cancelAction = UIAlertAction(title: "取消", style: .cancel, handler: nil)

let okAction = UIAlertAction(title: "确定", style: .default, handler: {

action in

print("点击了确定")

//调用页面里加入购物车js方法

self.theWebView!.evaluateJavaScript("addToCar('\(itemName)')",

completionHandler: nil)

})

alertController.addAction(cancelAction)

alertController.addAction(okAction)

self.present(alertController, animated: true, completion: nil)

}

}

override func didReceiveMemoryWarning() {

super.didReceiveMemoryWarning()

}

}

--- html页面 index.html(这里只展示主要js代码,还用到了jQuery) ---

$(function() {

//点击商品添加到购物车

$(".goodsItem").click(function() {

var itemName = $(this).children("img")[0].alt;

var message = {"method":"addToCarCheck","name":itemName};

window.webkit.messageHandlers.interOp.postMessage(message);

});

});

//添加到购物车

function addToCar(itemName){

//这里只是简单的给数量+1,用来演示

var num = parseInt($("#cartNums").text());

$("#cartNums").text(num+1);

}

源码下载:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

南充一中计算机机房被盗,成都理工大学与南充市第一中学共建优质生源基地

春秋代序立冬过,西河欢歌扬碧波;魅力一中呈诗韵,银杏绽黄迎嘉客。2019年11月14日上午10时,成都理工大学与南充市第一中学共建优质生涯基地的签约授牌仪式在南充一中新区隆重举行。南充一中副校长王洪秀在致辞中对关注南充一中发展…

list循环赋值_Python基础 | 0xd 条件判断与循环

条件判断所谓的条件判断就是根据一条或多条语句的执行结果(True/False)来决定执行那一块的代码。// 条件判断的三个关键字 //Python 使用if、else、elif 三个关键字的搭配来实现判断语句,使用示例如下:# 单分支(只有一个if),如果代码块只有一…

matlab 等高线_MATLAB作图实例:39:更改等高线图的填充颜色

本示例说明如何更改在填充等高线图中使用的颜色。更改颜色模板通过更改颜色图设置填充等高线图的颜色。将预定义的颜色图名称hot传递给colormap函数。[X,Y,Z] peaks;figurecontourf(X,Y,Z,20)colormap(hot)title(Hot Colormap)控制数据值到颜色模板的映射仅使用hot模板中心的颜…

git保存账号密码_Altium Designer 通过Git实现版本控制

为了解决每次对PCB工程进行修改时不能回溯的问题,以及为日后团队协作完成某项工程提供方便,所以我研究了一下如何在AD中实现版本控制。所幸的是,AD本身自带VCS功能(Version Control System),并支持SVN和Git两种VCS方式前提条件&am…

计算机字体原理,字体图标生成原理(1)

浏览器根据font-family解析渲染为不同图形的过程:1:读取文字内容转换成对应的 unicode码()计算机操作系统里面每个字符都有一个unicode编码,比如我们在web上输入\u6211跟输入“我”是一样的,因为「我」的unicode是\u6211(16进制)&#xff0…

asp 取菜单的名字_这样的奶茶店菜单设计,店面营业额能提高30%!

菜单是顾客了解奶茶店饮品品类、满足期待的一个载体,起着向顾客传递产品信息结构、激起购买欲望的重要作用。那么到底该怎么设计菜单才能吸引顾客呢?一、菜单风格要与品牌相符奶茶店的菜单设计风格一定要与品牌定位保持一致,着重突出店铺的风…

python ui自动化测试框架_Python自动化测试框架

PythonunittestrequestsHTMLTestRunner框架1 目录说明common:公共文档,存放包含HTMLTestRunner.py,logUtils.py等公用文件data:数据文档,存放测试数据;接口数据使用excel存储log:存放日志文件re…

计算机键盘怎么换键,笔记本电脑如何切换键盘_笔记本切换键盘的步骤-win7之家...

键盘是我们使用电脑必不可少的输入设备,在使用过程中,有时候需要进行键盘切换,比如数字和字母之间的切换,台式电脑切换比较简单,因为它字母跟数字键盘会分开,但是如果是笔记本电脑的话,要如何切…

geojson地图_Geojson地图pandas数据帧

geojson数据结构geojson作图方法geojson与pandashttps://blog.exploratory.io/visualizing-geospatial-data-with-your-own-geojson-f96dde0f6296​blog.exploratory.io数据结构GeoJSON是用于表示地理对象的格式。 它与常规JSON不同,因为它支持几何类型,…

views 多个文件夹 netcore_.NET Core 分发打包

由于 .NET Core 现已可用于更多平台,因此了解如何为其打包、命名并进行版本控制将很有用。 这样,无论用户选择在哪里运行 .NET,包维护人员均可以帮助确保获得一致的体验。 本文对以下用户非常有用:尝试从源生成 .NET Core。想要更…

dz论坛服务器技术支持,服务器更换 升级 dz论坛首页 dz其他页面打开为空白解决方法...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼1.症状:安装后一切正常,昨天发完nnn个帖子后突然论坛首页打开后空白2.解决办法:删除以下两个文件夹下所有文件forumdata/cache 和 /forumdata/templates3. 之后出现提示:Cache List: …

erlang安装_消息中间件(八)- RabbitMQ - 安装

步骤1:erlang步骤2:erlang 安装程序步骤3:配置路径步骤4:运行测试步骤5:安装 rabbitMQ步骤6:配置插件步骤7:重启 rabbitmq步骤8:管理员身份步骤9:重启 rabbitmq步骤10:访问管理界面步骤11:管理界面步骤 1 : erlangrabbitMQ 是基于 erlang 语言开发的,就如同 activem…

ihtml2document能不能根据id获取dom_使用DOM进行XML文件的解析

1. 什么是XML?xml是格式化的纯文本,用于存储数据和格式。2. DOM是什么?DOM是xml的一种解析方法(此外还包括SAX等,此处不提),它将xml文件抽象成为一个树型结构,这棵树个各个树叶就是节…

青茶什么时候拆_为什么日本绿茶那么绿?比中国的高级绿茶还要绿

我们经常可以从电影、电视、动画片、日式抹茶看到日本绿茶所呈现出来的样子,绿的,鲜脆欲滴的绿。到了日本,待客之道泡煎茶,可以更直观的看到煎茶的绿,这种绿是我们在国内不曾见到的绿,中国的高级绿茶也呈现…

单台web服务器性能,单台web服务器如何尽可能的提高网站性能

我觉得首先要选择一个合适的环境,对于大多数php站点来说,运行在lnmp(linuxnginxmysqlphp)环境下是个理想的选择.首先一点linux对比win的优势我就不说了。其次nginx的优势总结起来就是负载均衡,高并发性能优异。这里php采用fastcgi的方式接入n…

如何将dataset中的值赋值给datatable_金融行业实战项目:如何理解业务?

【面试题】下表是某金融App的数据,请结合Excel数据集中的数据完成下列问题(某金融公司面试题,文末有数据下载 )原始数据如下所示:为方便后期分析,我们对数据进行分类。数据通常分为3类:用户数据、行为数据、产品数据。…

python换循环颜色_python – 增加matplotlib颜色循环

你可以打电话ax2._get_lines.get_next_color()在彩色上推进彩色循环仪.不幸的是,这会访问私有属性._get_lines,因此这不是官方公共API的一部分,并且不能保证在未来版本的matplotlib中工作.一种更安全但不太直接的推进色彩循环器的方法是绘制零图:ax2.plot([], [])im…

css练习题4,复习webpack4之CSS文件代码分割

之前学习过webpack3的知识,但是webpack4升级后还是有很多变动的,所以这次重新整理一下webpack4的知识点,方便以后复习。这次学习webpack4不仅仅要会配置,记住核心API,最好还要理解一下webpack更深层次的知识&#xff0…

minhash算法检索相似文本_基于向量的深层语义相似文本召回?你需要bert和faiss...

在文章大话知识图谱--聊聊智能客服中,我介绍了智能客服系统利用FAQ问答库做自动问答,也就是基于信息检索的自动问答系统。它的一般做法流程是:构建一个大型的FAQ问答库,形式是(question,answer)…

vuex的命名空间有哪些_Python3 命名空间和作用域

命名空间先看看官方文档的一段话:A namespace is a mapping from names to objects.Most namespaces are currently implemented as Python dictionaries。命名空间(Namespace)是从名称到对象的映射,大部分的命名空间都是通过 Python 字典来实现的。命名…