WKWebView
是 在iOS 8
后推出要替代UIWebView
。相对于成熟的UIWebView
来讲,这个后生仔在使用上还是有点点小坑的~
使用
在初始化上,WKWebView
和 UIWebView
没有多大的差异。
|
|
二者在初始化上还是蛮像的。一个图样的我。(逃
仔细翻开了WKWebView
,发现其还提供一个初始化方法。
public init(frame: CGRect, configuration: WKWebViewConfiguration)
也就是可以用WKWebViewConfiguration
去init
一个WKWebView
。
后面再继续港 WKWebViewConfiguration
。
那几个协议
WKNavigationDelegate
WKNavigationDelegate
的协议方法还是挺多的。
|
|
WKUIDelegate
主要讲讲网页js
的一些函数——
alert()
comfirm()
prompt()
在UIWebView
中,js
使用上述三个函数,是可以成功弹出的。但是在WKWebView
中,使用着三个函数,是不会用任何反应的。原因是,把这三个函数都分别封装到WKUIDelegate
的方法中。但js
使用这些函数时,那么客户端会在以下几个协议方法中,监测到发送过来的信息,然后需要用原生代码去实现一个alert
。累cry~~~
|
|
踩坑
网页适配
有些网页在客户端上显示,会出现一些不适配的情况。使用UIWebView
的话,我们可以用使用其的scaleToFit
属性。即webView.scaleToFit = true
。但是在WKWebView
里,并没有这个属性,我们只能使用到JS注入
进行修改。
|
|
不过,还是不太推荐客户端去注入适配代码。最好还是告知前端,让他们去搞定这问题。个人觉得,两端少点干涉还是比较好滴~~~ (逃
客户端 -> 网页
有时间,我们需要客户端去调用前端的一些代码。e.g.
|
|
网页 -> 客户端
不像UIWebView
,WKWebView
无法使用JaveSciptCore
。我们需要使用到WKScriptMessageHandler
这个协议去进行一系列交互。
首先,在初始化阶段,需要使用到WKWebViewConfiguration
。放个文档注释先。
/*! @abstract Adds a script message handler.
@param scriptMessageHandler The message handler to add.
@param name The name of the message handler.
@discussion Adding a scriptMessageHandler adds a function
window.webkit.messageHandlers..postMessage( ) for all
frames.
*/open func add(_ scriptMessageHandler: WKScriptMessageHandler, name: String)
name
是客户端自定义好的一个字符串类型的命名空间。可以有多个name
。网页的js
代码,需要在进行交互的地方,使用上
来发送消息。
上个栗子🌰。
|
|
这是客户端使用WKWebViewConfiguration
去初始化一个WKWebView
。并且使用到一个name
为Test
的messageHandler
。而在网页需要进行交互的位置,则是加在一句代码。🌰
|
|
对应messageBody
载体的格式,貌似没有多大的规定。可以为NSNumber
, NSString
, NSDate
, NSArray
, NSDictionary
,甚至是NSNull
。也就是对应js
来说,应该是Number
,String
,Date
,json
,null
。
那么问题来了。客户端怎么去做处理呢?
客户端需要去实现WKScriptMessageHandler
的协议方法。
|
|
跳转app store
WKWebview
是无法直接跳转app store
。不明白爸爸为什么要这样。反正他高兴就好。。。。
那么如果PM
硬要跳转app store
的话,有两种方式——
1) 砍死PM
。。(ps: 个人极度推荐方式一)
2)那么你只能苦逼码码去解决了。
在WKNavigationDelegate
中,当接受到网页信息的时候,也就是——
|
|
有一些古怪的需求
某天,PM
跑过来跟你港,想要点击一个网页超链接,然后客户端去push controller
,而不是在原页面上刷新。。。
使用UIWebView
的时候,其实挺方便的,只需要在UIWebViewDelegate
的一个方法中去监听做判断就好。呐。看🌰。
|
|
但是,WKWebView
呢?
需要在WKNavigationDelegate
协议方法中,当接收到网页信息的时候——
|
|
结束语
暂时撸到这里吧。估计还有一些坑。后续继续踩,继续更新吧。
最后,上个demo吧。