主要介绍如何使用UIWebView网页视图和Html标签、CSS样式表、JavaScript语言等Html5相关技术。
相对于原生应用,Html5具有以下优点:
- 一次编写,到处运行。
- 在服务器完成更新部署。
不可避免的有得有失,Html5应用相比原生应用而言,在流畅性、访问设备硬件便利性、用户体验等方面时有差距的。
因此在iOS开发中,权衡利弊下,采用混合开发的模式,用原生技术创建不经常改变的布局页面和功能,用Html5创建需要实时变化的页面和功能。
比如在开发营销管理系统时,大部分页面和功能都采用原生开发,而报表因为项目分类杂七杂八的项目多、变动比较大,则会嵌入UIWebView,在UIWebView中加载Html5页面。
ps:UIWebview已经被替换为WKWebview
使用WKWebview加载网页
使用WKWebview之前需要导入WebKit
import UIKit
import WebKit
class ViewController: UIViewController,WKNavigationDelegate,WKUIDelegate{
var imageView : UIImageView?
override func viewDidLoad() {
super.viewDidLoad()
useWKWebview()
}
func useWKWebview() -> () {
let bounds = UIScreen.main.bounds
let frame = CGRect(x: 0, y: 0, width: bounds.width, height: bounds.height)
let webView = WKWebView(frame: frame)
webView.backgroundColor = UIColor.clear
let url = URL(string: "https://www.baidu.com")
let urlRequest = URLRequest(url: url!)
webView.load(urlRequest)
//允许左滑返回上层手势
webView.allowsBackForwardNavigationGestures = true
//回退
// webView.goBack()
//前进
// webView.goForward()
//刷新
// webView.reload()
//UI代理
webView.uiDelegate = self
//导航代理
webView.navigationDelegate = self
self.view.addSubview(webView)
}
}
运行结果:
WKWebViewConfiguration
为添加WKWebView配置信息
//创建网页配置对象
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// 创建设置对象
WKPreferences *preference = [[WKPreferences alloc]init];
//最小字体大小 当将javaScriptEnabled属性设置为NO时,可以看到明显的效果
preference.minimumFontSize = 0;
//设置是否支持javaScript 默认是支持的
preference.javaScriptEnabled = YES;
// 在iOS上默认为NO,表示是否允许不经过用户交互由javaScript自动打开窗口
preference.javaScriptCanOpenWindowsAutomatically = YES;
config.preferences = preference;
// 是使用h5的视频播放器在线播放, 还是使用原生播放器全屏播放
config.allowsInlineMediaPlayback = YES;
//设置视频是否需要用户手动播放 设置为NO则会允许自动播放
config.requiresUserActionForMediaPlayback = YES;
//设置是否允许画中画技术 在特定设备上有效
config.allowsPictureInPictureMediaPlayback = YES;
//设置请求的User-Agent信息中应用程序名称 iOS9后可用
config.applicationNameForUserAgent = @"ChinaDailyForiPad";
//自定义的WKScriptMessageHandler 是为了解决内存不释放的问题
WeakWebViewScriptMessageDelegate *weakScriptMessageDelegate = [[WeakWebViewScriptMessageDelegate alloc] initWithDelegate:self];
//这个类主要用来做native与JavaScript的交互管理
WKUserContentController * wkUController = [[WKUserContentController alloc] init];
//注册一个name为jsToOcNoPrams的js方法
[wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"jsToOcNoPrams"];
[wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@"jsToOcWithPrams"];
config.userContentController = wkUController;
WKUserScript
用于进行JavaScript注入
//以下代码适配文本大小,由UIWebView换为WKWebView后,会发现字体小了很多,这应该是WKWebView与html的兼容问题,解决办法是修改原网页,要么我们手动注入JS
NSString *jSString = @"var meta = document.createElement('meta'); meta.setAttribute('name', 'viewport'); meta.setAttribute('content', 'width=device-width'); document.getElementsByTagName('head')[0].appendChild(meta);";
//用于进行JavaScript注入
WKUserScript *wkUScript = [[WKUserScript alloc] initWithSource:jSString injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
[config.userContentController addUserScript:wkUScript];
WKUserContentController
这个类主要用来做native与JavaScript的交互管理
//这个类主要用来做native与JavaScript的交互管理
WKUserContentController * wkUController = [[WKUserContentController alloc] init];
//注册一个name为jsToOcNoPrams的js方法,设置处理接收JS方法的代理
[wkUController addScriptMessageHandler:self name:@"jsToOcNoPrams"];
[wkUController addScriptMessageHandler: