iOS WKWebView

iOS WKWebView

参考官方文档的学习使用



前言

提示:从iOS8.0和OS X 10.10开始,需使用WKWebView添加web内容,不要使用UIWebView或者WebView。


提示:以下是本篇文章正文内容,下面案例可供参考

一、WKWebView是什么?

显示交互式Web内容的对象,就像App内的浏览器。
Note: 您可以在WKWebView中使用httpBody内容发出POST请求

二、详细介绍

1.使用

代码如下(示例):

import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
    
    var webView: WKWebView!
    
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        
        let myURL = URL(string:"https://www.apple.com")
        let myRequest = URLRequest(url: myURL!)
        webView.load(myRequest)
    }
 }
    

默认情况下,Web视图会自动将显示在Web内容中的电话号码转换为“电话”链接。 轻按“电话”链接后,“电话”应用将启动并拨打该号码。若要关闭此默认行为,请使用不包含phoneNumber标志的WKDataDetectorTypes位字段设置dataDetectorTypes属性。

2.属性、方法详解

/* @abstract Checks whether or not WKWebViews handle the given URL scheme by default.
@param scheme The URL scheme to check.
*/
// 返回WebKit本机是否支持使用特定URL方案加载资源。
@available(iOS 11.0, *)
open class func handlesURLScheme(_ urlScheme: String) -> Bool

// 用于初始化Web视图的配置副本。
var configuration: WKWebViewConfiguration

// 返回使用指定frame和配置初始化的Web视图。
init(frame: CGRect, configuration: WKWebViewConfiguration)

// 遵守了NSCoding 用xib构建控件时
public init?(coder: NSCoder)

 ******************* View Information *****************

// 与webView关联的滚动视图
var scrollView: UIScrollView

// 页面title 支持KVO
var title: String?

// 当前URL 支持KVO
var url: URL?

// 自定义用户代理字符串。如果未设置自定义用户代理字符串,则设置为nil。
var customUserAgent: String?

// 当前提交的导航的SecTrustRef对象。 支持KVO
// 用于评估信任的对象
var serverTrust: SecTrust?

// Deprecated 当前提交的导航的证书链的对象数组。
var certificateChain: [Any]


// ******************* Delegates *****************

// WebView的导航代理 
// [详细介绍](https://blog.csdn.net/meiyulong518/article/details/108733416)
var navigationDelegate: WKNavigationDelegate?

// 用户界面代理
var uiDelegate: WKUIDelegate?


 ******************* Loading Content *****************

// 估计当前导航中已加载的部分。 范围为0.0到1.0。
// 导航加载完成后estimatedProgress值保持为1.0直到新的导航开始重新设置为0.0 。
// 支持KVO
var estimatedProgress: Double
//ex. estimatedProgress 监听 
webView.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        
        if keyPath == "estimatedProgress" {
            print(webView.estimatedProgress)
        }
    }

// 是否已通过安全加密的连接加载页面上的所有资源 支持KVO
var hasOnlySecureContent: Bool

// 设置网页内容和基本URL
func loadHTMLString(String, baseURL: URL?) -> WKNavigation?

// WKNavigation  跟踪网页的加载进度,Web视图的加载方法返回了WKNavigation,并且传递给导航委托方法,以唯一地标识网页
// 从头到尾加载。
@available(iOS 8.0, *)
open class WKNavigation : NSObject {

    
    /** The content mode used when loading this webpage.
     @discussion The value is either WKContentModeMobile or WKContentModeDesktop.
     */
    @available(iOS 13.0, *)
    open var effectiveContentMode: WKWebpagePreferences.ContentMode { get }
}

// 当前是否正在加载内容
var isLoading: Bool

// 重新加载当前页面 返回代表重新加载的网页的新导航。
func reload() -> WKNavigation?
func reload(Any?)//发送此消息的对象

// 重新加载当前页面,并在可能的情况下使用缓存验证条件执行端到端重新验证。
func reloadFromOrigin() -> WKNavigation?
func reloadFromOrigin(Any?)//发送此消息的对象

// 停止加载当前页面上的所有资源。
func stopLoading()
func stopLoading(Any?)//发送此消息的对象

// 设置网页内容和基本URL, 数据,数据的MIME类型,数据的字符编码名称,baseURL用于解析文档中相对URL的URL iOS 9.0+
func load(Data, mimeType: String, characterEncodingName: String, baseURL: URL) -> WKNavigation?

// 加载本地文件。 导航到的文件URL,允许读取访问的URL。
// 如果ReadAccessURL是一个单独的文件则可能只会加载这个文件,
// 如果ReadAccessURL是一个文件夹则会加载这个文件下的文件,iOS 9.0+
func loadFileURL(URL, allowingReadAccessTo: URL) -> WKNavigation?


 ******************* Scaling Content *****************

// 放大手势是否会更改WebView的放大比例。 macOS 10.10+
var allowsMagnification: Bool

// 当前页面内容缩放的比例 macOS 10.10+
var magnification: CGFloat

// 按指定比例缩放页面内容,并将结果居中指定点 macOS 10.10+
func setMagnification(CGFloat, centeredAt: CGPoint)


 ******************* Navigating *****************

// 水平滑动手势是否会触发后退列表导航
var allowsBackForwardNavigationGestures: Bool

// WebView的后退列表
var backForwardList: WKBackForwardList

// 在后退列表中有一个后项可以导航到。
var canGoBack: Bool

// 在后退列表中有一个可以导航到的前进项目。
var canGoForward: Bool

// 是否允许按下链接可显示链接目标的预览。
// 在iOS中,此属性在支持3D Touch的设备上可用。 在iOS 10及更高版本中,默认值为true; 在此之前,默认值为false。
// 如果将此属性的值设置为true,则iOS用户可以按压链接来预览链接和检测到的数据,例如地址和电话号码(WKDataDetectorTypes iOS 10)。 用户将这样的预览称为偷看。 如果用户在链接预览上按得更深,则预览将导航(或pop)到目标。 由于弹出式导航会将用户从您的应用切换到Safari,因此它是iOS应用的可选功能。
// 如果你想支持链接预览,并且也想将用户保留在你的App里,你可以使用SFSafariViewController,如果你将WebView用作应用内浏览器,则最好进行此更改,Safari视图控制器类自动支持链接预览。
// 在macOS中,此属性在具有Force Touch触控板的设备上可用。 在macOS中,默认值为true。
// 将此属性设置为默认值true时,macOS用户可以强制单击链接以显示预览窗口,其中显示了链接的目的地。 如果用户然后单击预览,则目的地将在Safari中打开。
// 在两个平台上,将此属性设置为true时,所有类型的检测到的数据都会对按压做出响应,也就是说,在iOS 9和OS X v10.11中,您无法指定WKWebView类中检测到的数据类型
var allowsLinkPreview: Bool

// SFSafariViewController Test
import SafariServices
let url = URL.init(string: "https://www.baidu.com")
let vc = SFSafariViewController(url: url!)
self.present(vc, animated: true, completion: nil)

// 导航到后退列表中的后一项。如果在后退列表中没有后项,则返回为nil
func goBack() -> WKNavigation?
func goBack(Any?)

// 导航到后退列表中的前一项。 如果在后退列表中没有前项,则返回为nil
func goForward() -> WKNavigation?
func goForward(Any?)

// 从后退列表导航到一个项目,并将其设置为当前项目。
// to:导航到的项目。 该项目必须是网络视图的后退列表中的项目之一。
// 如果它已经是当前项目或不属于Web视图的后退列表,则返回null。
func go(to: WKBackForwardListItem) -> WKNavigation?

// 导航到请求的URL。
func load(URLRequest) -> WKNavigation?









 ******************* Executing JavaScript *****************

// 执行JavaScript字符串,该方法将脚本的结果(或错误)发送到完成处理程序(completionHandler)。 完成处理程序始终在主线程上运行。
func evaluateJavaScript(String, completionHandler: ((Any?, Error?) -> Void)?)

 ******************* Taking Snapshots *****************

// 拍摄可见视图的快照。
func takeSnapshot(with: WKSnapshotConfiguration?, completionHandler: (UIImage?, Error?) -> Void)
webView.takeSnapshot(with: nil) { (image, error) in
   if let img = image {
       UIImageWriteToSavedPhotosAlbum(img, self, nil, nil)
   }
 }



 ******************* Instance Properties 实例属性 *****************

// iOS 14.0+. 媒体类型
var mediaType: String?

// iOS 14.0+ 页面缩放比例
var pageZoom: CGFloat

 ******************* Instance Methods 实例方法 beat  *****************

// iOS 14.0+  Xcode 12.0+ 没有概述
func callAsyncJavaScript(String, arguments: [String : Any], in: WKFrameInfo?, in: WKContentWorld, completionHandler: ((Result<Any, Error>) -> Void)?)

// iOS 14.0+ Xcode 12.0+ 没有概述
func createPDF(configuration: WKPDFConfiguration, completionHandler: (Result<Data, Error>) -> Void)

// iOS 14.0+ Xcode 12.0+ 没有概述
func createWebArchiveData(completionHandler: (Result<Data, Error>) -> Void)

// iOS 14.0+ Xcode 12.0+ 没有概述
func evaluateJavaScript(String, in: WKFrameInfo?, in: WKContentWorld, completionHandler: ((Result<Any, Error>) -> Void)?)

// iOS 14.0+ Xcode 12.0+ 没有概述
func find(String, configuration: WKFindConfiguration, completionHandler: (WKFindResult) -> Void)

// iOS 14.0+ Xcode 12.0+ 没有概述
func printOperation(with: NSPrintInfo) -> NSPrintOperation


// END

总结

以上就是今天要介绍的内容,本文简单介绍了WKWebView的属性方法和使用,接下来我会用三种不同加载的方式来进一步深入的总结学习。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本demo是WKWebView的基本使用和交互 ,实现了原生调用js的方法、js调用原生的方法、通过拦截进行交互的方法;修改内容 加入沙盒 / /加载沙盒 不带参数 // NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); // NSString * path = [paths objectAtIndex:0]; // path = [path stringByAppendingString:[NSString stringWithFormat:@"/app/html/index.html"]]; // NSURL *url = [NSURL URLWithString:[[NSString stringWithFormat:@"file://%@",path] stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLFragmentAllowedCharacterSet]] relativeToURL:[NSURL fileURLWithPath:NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject]]; // [self.wkView loadFileURL:url allowingReadAccessToURL:[NSURL fileURLWithPath: [paths objectAtIndex:0]]]; // 带参数 /* NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString * path = [paths objectAtIndex:0]; path = [path stringByAppendingString:[NSString stringWithFormat:@"/app/html/index.html"]]; NSURL * url = [NSURL fileURLWithPath:path isDirectory:NO]; NSURLComponents *urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO]; [queryItemArray addObject:[NSURLQueryItem queryItemWithName:@"version" value:[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]]]; [urlComponents setQueryItems:queryItemArray]; [self.wkView loadFileURL:urlComponents.URL allowingReadAccessToURL:[NSURL fileURLWithPath: [paths objectAtIndex:0]]]; */

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值