WKWebView详解

  • Post author:
  • Post category:其他












        
 @财产(非原子,只读副本)NSURL * URL; ```
 iOS 9.0+自定义用户代理如果不想自定义用户代理,设为nil即可



@property (nonatomic,copy)NSString * customUserAgent;

iOS 10.0+当前浏览页面的SecTrustRef对象

@property (非原子,只读)SecTrustRef serverTrust;

的iOS 9.0-10.0当前浏览页面的证书链(已废弃)其元素是SecCertificateRef


@属性(非原子,只读拷贝)的NSArray * certificateChain; “`


设置代理

页面浏览代理



@property(nonatomic,weak)id <WKNavigationDelegate> navigationDelegate;


界面代理



@property(可空,非原子,弱)id <WKUIDelegate> UIDelegate;



加载内容

当前浏览页面加载进度的比例(估算值)



这个值根据预期接收的字节总数(包括主文档和所有潜在的子资源)从0.0到1.0不等@财产(非原子,只读)双重估计进展;


在页面加载完成后,估算的进度保持在1.0,直到新的导航开始,这时估算的进度重置为0.0支持KVO是否页面内的所有资源都是通过安全链接加载的支持KVO。

` “

@property(nonatomic,readonly)BOOL hasOnlySecureContent; “`

设置网页的内容和基础URL字符串是网页的内容



- (WKNavigation *)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;


基本URL是用于解析文档内相对URL的URL 返回一个新的WKNavigation对象是否正在加载内容请立即获取iTunes KVO。

 @属性(非原子,只读,吸气= isLoading)BOOL加载; ```
重新加载当前页面返回一个新的WKNavigation对象



  • (WKNavigation *)reload; “`

    是不带缓存的验证(对比reloadFromOrigin)重新加载当前页面(带缓存的验证)如果可能的话使用高速缓存进行验证的条件执行端至端重新验证
 -WKNavigation *)reloadFromOrigin; ``
是带缓存的验证停止加载当前网页中的所有资源




  • (void)stopLoading; “`


    的iOS 9.0+设置网页内容和基本URL

    1。

data是网页内容

@property(nonatomic) BOOL allowsMagnification;
@属性(非原子,只读)BOOL canGoBack; ```
是否可以前进即前进后退记录中,当前记录之后是否还有记录



@property(nonatomic,readonly)BOOL canGoForward; “`

iOS 9.0+是允许按住链接就展示链接的预览1.在iOS上,这个属性只在支持3D Touch的设备上支持

   @propertynonatomicBOOL allowsLinkPreview; ``` 
2.10的iOS及以后的系统版本默认值是YES,之前的默认值是NO 3.如果将该属性的值设置为YES,则iOS的用户可以按下链接来预览链接,并可以检测到地址和电话号码等数据。这样的预览被用户称为peeks 4.如果用户在链接预览上更深入地按下,预览将pop到目标网址。该动作会将应用程序切换到Safari 5.如果您想在的iOS中支持链接预览,但又想要在应用程序中保留用户,那么您可以将WKWebView类转换为SFSafariViewController类6.如果您使用web视图作为应用内浏览器,那么进行这种更改是最佳选择7。






SFSafariViewController自动支持链接预览
 8. iOS
    10.0+开始支持自定义链接预览,你也可以通过这种方式来实现用户预览网页并pop后仍然留在应用内而不用切换到Safari,只是你需要做一些额外的适配工作


后退
即在前进后退列表中导航到上一个记录`- (WKNavigation *)goBack;`
返回一个新的WKNavigation对象
如果没有记录可以后退,则返回nil

前进
即在前进后退列表中导航到下一个记录`- (WKNavigation *)goForward;`
返回一个新的WKNavigation对象
如果没有记录可以前进,则返回nil

前进/后退到一个指定的记录上
item必须是WebView的WKBackForwardList中的一个记录
  • (WKNavigation

    )goToBackForwardListItem:(WKBackForwardListItem

    )item;

返回一个新的WKNavigation对象
如果已经在当前记录,或者没有找到,则会返回nil

加载一个请求
返回一个新的WKNavigation对象。
  • (WKNavigation

    )loadRequest:(NSURLRequest

    )request;

**执行JavaScript**
执行JavaScript字符串

 1. completionHandler会在脚本执行完成或者失败时调用
  • (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *error))completionHandler;

 2. id是代码执行成功的返回结果,error是执行失败的结果
 3. completionHandler在主线程中执行


获取截图
获取WebView的可见区域截图
  • (void)takeSnapshotWithConfiguration:(WKSnapshotConfiguration *)snapshotConfiguration completionHandler:(void (^)(UIImage *snapshotImage, NSError *error))completionHandler;


WKWebViewConfiguration
使用WKWebViewConfiguration类,你可以决定网页的渲染时机,媒体的播放方式,用户选择项目的粒度,以及很多其他的选项。

WKWebViewConfiguration只会在webview第一次初始化的时候使用,你不能用此类来改变一个已经初始化完成的webview的配置。


UserAgent中的应用名称

@property(nonatomic, copy) NSString *applicationNameForUserAgent;


WebView使用的偏好选项

@property(nonatomic, strong) WKPreferences *preferences;


进程池

 1. webview将会从该进程池中获取一个Web Content 进程

@property(nonatomic, strong) WKProcessPool *processPool;


 2. 在初始化web视图时,将为它从指定的池中创建一个新的Web Content 进程,或者使用该池中的现有进程


与WebView关联的WKUserContentController对象

@property(nonatomic, strong) WKUserContentController *userContentController;


与WebView关联的WKWebsiteDataStore对象

 1. 如果一个WebView关联了一个非持久化的WKWebsiteDataStore,将不会有数据被写入到文件系统

@property(nonatomic, strong) WKWebsiteDataStore *websiteDataStore;


 2. 该特性可以用来实现隐私浏览。

是否应该总是允许网页的缩放

 1. 将此属性设置为TRUE可以使页面被缩放,无论页面的意图是什么   
   `@property(nonatomic) BOOL ignoresViewportScaleLimits;`
 2. 设置为TRUE会覆盖网页中的user-scalable HTML属性
 3. 默认值为FALSE。

是否抑制内容渲染呈现,直到它完全载入内存
默认值NO

@property(nonatomic) BOOL suppressesIncrementalRendering;


HTML5视频是否内联播放

 1. 内联播放就是指在页面内播放而非必须使用native的全屏播放控件

@property(nonatomic) BOOL allowsInlineMediaPlayback;


 2. 你必须设置此属性以播放内联视频
 3. 当在iPhone的HTML文档中添加视频元素时,还必须包括playsinline属性
 4. 在iOS 10.0之前创建的应用程序必须使用webkit-playsinline属性
 5. iPhone的默认值为false,而iPad的默认值为true

是否允许AirPlay播放媒体

@property(nonatomic) BOOL allowsAirPlayForMediaPlayback;


是否允许HTML5视屏以画中画形式播放
默认YES

@property(nonatomic) BOOL allowsPictureInPictureMediaPlayback;


哪些媒体类型需要用户手势才能开始播放
使用WKAudiovisualMediaTypeNone表明不需要用户手势开始播放媒体`@property(nonatomic)WKAudiovisualMediaTypes mediaTypesRequiringUserActionForPlayback;`

已废弃iOS 9.0以后使用allowsAirPlayForMediaPlayback

@property(nonatomic) BOOL mediaPlaybackAllowsAirPlay;


已废弃iOS 10.0以后使用mediaTypesRequiringUserActionForPlayback

@property(nonatomic) BOOL requiresUserActionForMediaPlayback;


已废弃iOS 10.0以后使用mediaTypesRequiringUserActionForPlayback

@property(nonatomic) BOOL mediaPlaybackRequiresUserAction;


用户可以在WebView中交互式地选择内容的粒度级别
默认值是 WKSelectionGranularityDynamic

@property(nonatomic) WKSelectionGranularity selectionGranularity;


用户界面元素的方向性
默认值是WKUserInterfaceDirectionPolicyContent

@property(nonatomic) WKUserInterfaceDirectionPolicy userInterfaceDirectionPolicy;


设置需要检测的数据类型

 1. 指定该属性将会给匹配的页面内容增加用户交互

@property(nonatomic) WKDataDetectorTypes dataDetectorTypes;


 2. 例如,如果将其设为WKDataDetectorTypeLink类型,浏览器将会对页面中的“Visit apple.com” 字符串中的
    “apple.com”添加链接


为指定的URL Scheme添加处理器(WKURLSchemeHandler)

 1. 一个URL Scheme只能有一个处理器-

(void)setURLSchemeHandler:(id)urlSchemeHandler

forURLScheme:(NSString *)urlScheme;


 2. 对一个不合法的URL Scheme注册处理器,注册多次,或者注册一个已经注册过的处理器,都会触发异常
 3. 你可以调用handlesURLScheme:方法来判断WebKit是否可以处理一个特定的URL Scheme
 4. URL Scheme对大小写敏感
 5. 一个合法的URL Scheme只能是以ASCII字母开头并且只能是由ASCII字母,数字,'+',  '-''.'组成


返回URL Scheme对应的WKURLSchemeHandler
  • (id)urlSchemeHandlerForURLScheme:(NSString *)urlScheme;

WKPreferences
一个WKPreferences封装了一个webview的偏好选项,在WKWebViewConfiguration中设置

最小字体的尺寸
默认值是0

@property(nonatomic) CGFloat minimumFontSize;


是否启用JavaScript

 1. 默认值YES `@property(nonatomic) BOOL javaScriptEnabled;`
 2. 设置为NO将会禁用页面加载的或执行的JavaScript
 3. 但这个配置不会影响用户的script

是否可以在没有用户操作的情况下自动打开窗口
iOS默认为NO,macOS默认为YES
`@property (nonatomic) BOOL javaScriptCanOpenWindowsAutomatically;`

**WKProcessPool**
一个WKProcessPool对象代表Web Content的进程池。

与WebView的进程池关联的进程池通过其configuration来配置。每个WebView都有自己的Web Content进程,最终由一个有具体实现的进程来限制;在此之后,具有相同进程池的WebView最终共享Web Content进程。

WKProcessPool对象只是一个简单的不透明token,本身没有属性或者方法。

**WKUserContentController**
WKUserContentController对象提供了一种向WebView发送JavaScript消息或者注入JavaScript脚本的方法

**添加WKScriptMessageHandler**
添加一个WKScriptMessageHandler
添加一个名称为name的WKScriptMessageHandler将会导致在所有使用该WKScriptMessageHandler的WebView的所有frame中定义一个JavaScript函数window.webkit.messageHandlers.name.postMessage(messageBody)
  • (void)addScriptMessageHandler:(id)scriptMessageHandler name:(NSString *)name;

**添加或移除WKUserScript**添加一个WKUserScript


 ``` -
(无效)addUserScript:(WKUserScript *)userScript; ```
移除所有的WKUserScript



 ```
 - (无效)removeAllUserScripts; ```
移除名字名字的WKScriptMessageHandler



 ``` -
(空)removeScriptMessageHandlerForName:(的NSString *)名称; ```
关联的所有WKScriptMessageHandler



 ```
 @属性(非原子,只读,复制)的NSArray <WKUserScript *> * userScripts; ``` 
**添加或移除内容规则**的iOS 11.0+添加一个WKContentRuleList





 ``` -
(空)addContentRuleList:(WKContentRuleList *)contentRuleList; ```
的iOS 11.0+移除一个WKContentRuleList



 ```
- (void)removeContentRuleList:(WKContentRuleList *)contentRuleList;

iOS 11.0+移除所有的WKContentRuleList

- (void)removeAllContentRuleLists;


WKScriptMessageHandler


为一个实现了WKScriptMessageHandler协议的类提供一个接收来自网页的JavaScript调用的方法

当收到来自网页的一次JavaScipt调用时响应

userContentController是调用该方法的WKUserContentController,message是收到的JavaScript消息

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;


WKScriptMessage


一个WKScriptMessage对象包含了一个JavaScritp消息的相关信息

消息体

只能是这些类型 NSNumber, NSString, NSDate, NSArray, NSDictionary, NSNull

@property(nonatomic, readonly, copy) id body;

发送消息的frame

@property(nonatomic, readonly, copy) WKFrameInfo *frameInfo;

发送消息的WKScriptMessageHandler的名字

@property(nonatomic, readonly, copy) NSString *name;

发送消息的WKWebView

@property(nonatomic, readonly, weak) WKWebView *webView;


WKFrameInfo


一个WKFrameInfo对象包含了一个网页中的farme的相关信息。其只是一个描述瞬时状态的纯数据对象,不能用来在多次消息调用中唯一标识一个frame。

该frame是否是该网页的main frame或者子frame

@property(nonatomic, readonly, getter=isMainFrame) BOOL mainFrame;

frame对应的当前的请求

@property(nonatomic, readonly, copy) NSURLRequest *request;

frame的securityOrigin

@property(nonatomic, readonly) WKSecurityOrigin *securityOrigin;

frame对应的webView

@property(nonatomic, readonly, weak) WKWebView *webView;


WKSecurityOrigin


一个WKSecurityOrigin对象由host,protocol和port组成。任何一个与正在加载的网页拥有相同WKSecurityOrigin的URL加载是一个First Party加载。First Party网页可以访问彼此的脚本和数据库资源。其只是一个描述瞬时状态的纯数据对象,不能用来在多次消息调用中唯一标识一个SecurityOrigin。

@property(nonatomic, readonly, copy) NSString *host;

@property(nonatomic, readonly) NSInteger port;

@property(nonatomic, readonly, copy) NSString *protocol;


WKUserScript


一个WKUserScript对象代表了一个可以被注入网页中的脚本

初始化一个可以被添加到WKUserContentController的WKUserScript脚本对象

  1. 如果脚本不能被注入则会返回nil
- (instancetype)initWithSource:(NSString *)source
    injectionTime:(WKUserScriptInjectionTime)injectionTime
    forMainFrameOnly:(BOOL)forMainFrameOnly;
  1. source 脚本的代码
  2. injectionTime 脚本注入的时机,必须是这个WKUserScriptInjectionTime枚举值
  3. forMainFrameOnly YES 只向main frame注入脚本, NO 则会向所有的frame注入脚本

脚本的代码

@property(nonatomic, readonly, copy) NSString *source;

脚本注入的时机

必须是这个WKUserScriptInjectionTime枚举值

@property(nonatomic, readonly) WKUserScriptInjectionTime injectionTime;

是否只注入到main frame

YES 只向main frame注入脚本

@property(nonatomic, readonly, getter=isForMainFrameOnly) BOOL forMainFrameOnly;

NO 则会向所有的frame注入脚本


WKUserScriptInjectionTime枚举


WKUserScriptInjectionTimeAtDocumentStart在document element创建之后,在所有其他内容加载之前

WKUserScriptInjectionTimeAtDocumentEnd在document加载完成之后,在其他子资源加载完成之前


WKContentRuleList


一个编译过的规则列表,应用到Web Content上。从WKContentExtensionStore中创建或者取得。

标识符

@property(nonatomic, readonly, copy) NSString *identifier;


WKContentRuleListStore


返回默认的Store

+ (instancetype)defaultStore;

在url路径文件路径下创建一个Store并返回

当创建时,Store的内容从该路径下的所有编译过的规则列表加载

+ (instancetype)storeWithURL:(NSURL *)url;

新增的变化,如编译一个新的规则列表,删除一个已经存在的规则列表,都会持久化在相同的路径

获取所有规则列表的identifier

- (void)getAvailableContentRuleListIdentifiers:(void (^)(NSArray<NSString *> *))completionHandler;

查找指定identifier的WKContentRuleList

- (void)lookUpContentRuleListForIdentifier:(NSString *)identifier completionHandler:(void (^)(WKContentRuleList *, NSError *))completionHandler;

编译一个新的规则列表并添加到Store

encodedContentRuleList JSON格式的源文件,关于其规则见 Safari Content-Blocking Rules Reference

- (void)compileContentRuleListForIdentifier:(NSString *)identifier encodedContentRuleList:(NSString *)encodedContentRuleList completionHandler:(void (^)(WKContentRuleList *, NSError *))completionHandler;

移除指定identifier的WKContentRuleList

- (void)removeContentRuleListForIdentifier:(NSString *)identifier completionHandler:(void (^)(NSError *))completionHandler;


WKWebsiteDataStore


一个WKWebsiteDataStore对象代表了被网页使用的各种类型的数据。包括cookies,磁盘文件,内存缓存以及持久化数据如WebSQL,IndexedDB数据库,local storage。

返回默认的WKWebsiteDataStore

+ (WKWebsiteDataStore *)defaultDataStore;

返回一个新的非持久化的WKWebsiteDataStore

  1. 如果一个WebView关联了一个非持久化的WKWebsiteDataStore,将不会有数据被写入到文件系统
 +(WKWebsiteDataStore *)nonPersistentDataStore;
  1. 该特性可以用来实现隐私浏览

是否是非持久化的

@property(nonatomic, readonly, getter=isPersistent) BOOL persistent;

返回WKHTTPCookieStore对象

@property(nonatomic, readonly) WKHTTPCookieStore *httpCookieStore;

获取指定类型的WKWebsiteDataRecord

网站数据类型定义 Available Data Types

- (void)fetchDataRecordsOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(NSArray<WKWebsiteDataRecord *> *))completionHandler;

获取所有可用的数据类型

网站数据类型定义 Available Data Types

+ (NSSet<NSString *> *)allWebsiteDataTypes;

从指定的dataRecords中移除指定类型的WKWebsiteDataRecord

- (void)removeDataOfTypes:(NSSet<NSString *> *)dataTypes forDataRecords:(NSArray<WKWebsiteDataRecord *> *)dataRecords completionHandler:(void (^)(void))completionHandler;

移除指定日期之后发生修改的指定类型的WKWebsiteDataRecord

- (void)removeDataOfTypes:(NSSet<NSString *> *)websiteDataTypes modifiedSince:(NSDate *)date completionHandler:(void (^)(void))completionHandler;


WKHTTPCookieStore


管理与特定的WKWebsiteDataStore关联的HTTP cookie的对象

获取所有的cookies

- (void)getAllCookies:(void (^)(NSArray<NSHTTPCookie *> *))completionHandler;

设置一个cookie

- (void)setCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler;

移除一个cookie

- (void)deleteCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler;

添加一个WKHTTPCookieStoreObserver观察者

WKHTTPCookieStore不会强引用持有该observer

- (void)addObserver:(id<WKHTTPCookieStoreObserver>)observer;

你应当在不用observer的时候主动将其移除掉

移除一个WKHTTPCookieStoreObserver

- (void)removeObserver:(id<WKHTTPCookieStoreObserver>)observer;


WKHTTPCookieStoreObserver


当WKHTTPCookieStore的cookies发生变化时调用

- (void)cookiesDidChangeInCookieStore:(WKHTTPCookieStore *)cookieStore;


WKWebsiteDataRecord


一个WKWebsiteDataRecord对象代表了按照源URL的domain名和后缀分类的网页数据

存在于此WKWebsiteDataRecord的网站数据类型

网站数据类型定义 Available Data Types

@property(nonatomic, readonly, copy) NSSet<NSString *> *dataTypes;

显示名称。通常,显示名称是来自资源的SecurityOrigin的域名加后缀。

@property(nonatomic, readonly, copy) NSString *displayName;


可用的数据类型

定义WKWebsiteDataRecord中可用的数据类型的字符串常量磁盘缓存



NSString * const WKWebsiteDataTypeDiskCache;


内存缓存



NSString * const WKWebsiteDataTypeMemoryCache;

离线web应用缓存

NSString * const WKWebsiteDataTypeOfflineWebApplicationCache;

饼干

的的NSString * const的的WKWebsiteDataTypeCookies;

HTML会话存储

NSString * const WKWebsiteDataTypeSessionStorage;

HTML本地存储

NSString * const WKWebsiteDataTypeLocalStorage;

WebSQL数据库

NSString * const WKWebsiteDataTypeWebSQLDatabases;

IndexedDB数据库

 NSString * const WKWebsiteDataTypeIndexedDBDatabases; `` 
** WKAudiovisualMediaTypes **



 - `WKAudiovisualMediaTypeNone` 都不需要用户的手势就能开始播放

   `WKAudiovisualMediaTypeAudio` 包含音频的媒体类型需要用户的手势才能开始播放

   `WKAudiovisualMediaTypeVideo` 包含视频的媒体类型需要用户的手势才能开始播放

   `WKAudiovisualMediaTypeAll` 所有的媒体类型都需要用户的手势才能开始播放

**WKSelectionGranularity**
 - WKSelectionGranularityCharacter 选择端点可以放置在任何字符边界上

   WKSelectionGranularityDynamic
   选择的粒度取决于选择的不同。当选择是在单一块中时粒度可能是单个的字符,当选择不是局限于单一块,粒度可能是一个块

**WKUserInterfaceDirectionPolicy**
用于确定WebView中用户界面元素的方向性的策略。包括ltr(从左到右)和rtl(从右到左)两种方向。文本的书写方向就由此属性来指定。

WKUserInterfaceDirectionPolicyContent 方向性遵循CSS /HTML/ XHTML规范。这是userInterfaceDirectionPolicy的默认值。可以参见CSS direction属性或者HTML dir属性。

WKUserInterfaceDirectionPolicySystem 方向性遵循View的userInterfaceLayoutDirection属性。NSUserInterfaceLayoutDirection包括`NSUserInterfaceLayoutDirectionLeftToRight`和`NSUserInterfaceLayoutDirectionRightToLeft`两个枚举值。

**WKDataDetectorTypes**

 - `WKDataDetectorTypeNone` 不执行检测

   `WKDataDetectorTypePhoneNumber` 电话号码

   `WKDataDetectorTypeLink` 文本中的url

   `WKDataDetectorTypeAddress` 地址

   `WKDataDetectorTypeCalendarEvent` 在未来的日期和时间

   `WKDataDetectorTypeTrackingNumber` 跟踪号码/查询号/运单号

   `WKDataDetectorTypeFlightNumber` 航班号

`WKDataDetectorTypeLookupSuggestion`  暂未知

   `WKDataDetectorTypeSpotlightSuggestion` Spotlight的建议(已弃用)

   WKDataDetectorTypeAll 上述所有检测类型。选择此值将自动包含添加到这个常量的任何新的检测类型

**WKURLSchemeHandler**
用来处理WebKit无法处理的URL Scheme类型的资源

开始加载特定资源时调用
  • (void)webView:(WKWebView *)webView startURLSchemeTask:(id)urlSchemeTask;

停止载特定资源时调用

 1. WebKit将在你的handler停止处理这个任务时调用这个方法
  • (void)webView:(WKWebView *)webView

    stopURLSchemeTask:(id)urlSchemeTask;

 2. 在此此方法调用之后,你的handler不应该调用这个任务的任何方法,否则会触发异常

**WKURLSchemeTask**
用来加载资源的任务

加载的请求

@property(nonatomic, readonly, copy) NSURLRequest *request;


设置当前任务的response

 1. 每个任务必须至少调用一次这个方法
 `- (void)didReceiveResponse:(NSURLResponse *)response;`

 2. 如果你尝试在任务完成后发送一个新的response对象,会触发异常
 3. 如果在任务已经停止加载后调用,将会触发异常

为任务添加接收的数据

 1. 在任务接受到最终的response对象后,你应当开始发送
  - (void)didReceiveData:(NSData *)data; 调用这个方法,新的数据都会append到之前的数据后
 3. 如果你尝试在发送response之前或者任务已经结束之后发送数据,将会触发异常
 4. 如果在任务已经停止加载后调用,将会触发异常

将任务标记为成功完成

 1. 如果你尝试在发送response之前或者任务已经结束之后调用该方法,将会触发异常
 `- (void)didFinish;`
 2. 如果在任务已经停止加载后调用,将会触发异常

把任务标记为失败

 1. 如果在任务已经被标记为结束或失败后再调用这个方法会触发异常
  • (void)didFailWithError:(NSError *)error;

 2. 如果在任务已经停止加载后调用,将会触发异常

> 正常情况的调用顺序应该是: 
> didReceiveResponse(至少1次) 
> didReceiveResponse
> didReceiveResponse 
> ... 
> didReceiveData(至少0次) 
> didReceiveData
> didReceiveData 
> ... 
> didFinish/didFailWithError(务必调用)
> 
> 但是在任务被停止后,应该立即停止上面的任何调用

**WKNavigationDelegate**
通过实现WKNavigationDelegate协议的方法可以自定义WebView接受、加载和完成浏览请求过程的一些行为。

当WebView开始接收网页内容- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;vView的内容开始加载时触发
  • (void)webView:(WKWebView

    )webView didStartProvisionalNavigation:(WKNavigation

    )navigation;

主机地址重定向时触发
  • (void)webView:(WKWebView

    )webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation

    )navigation;

当WebView需要响应网页的登录请求时触发
稍后再详细研究
  • (void)webView:(WKWebView

    )webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge

    )challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler;

页面发生错误时触发
  • (void)webView:(WKWebView

    )webView didFailNavigation:(WKNavigation

    )navigation withError:(NSError *)error;

当页面加载内容过程中发生错误时触发
  • (void)webView:(WKWebView

    )webView didFailProvisionalNavigation:(WKNavigation

    )navigation withError:(NSError *)error;

当前页面加载完成后触发
  • (void)webView:(WKWebView

    )webView didFinishNavigation:(WKNavigation

    )navigation;

当WebContent进程中止时触发
  • (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView;

决定是否允许或者取消一次页面加载请求

 1. WKNavigationAction描述了触发本次请求的行为
  • (void)webView:(WKWebView

    )webView decidePolicyForNavigationAction:(WKNavigationAction

    )navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;

 2. decisionHandler block在app已经决定允许或取消页面请求时调用
 3. 这个block携带一个参数,是WKNavigationActionPolicy枚举类型
 4. WKNavigationActionPolicy枚举包括WKNavigationActionPolicyCancel取消和WKNavigationActionPolicyAllow允许两个枚举值5.你可以立即调用该块或者保存块在并以后的时间异步调用它


在已经收到响应时决定是否允许或者取消页面的加载1。WKNavigationResponse描述了response的信息


  • (void)webView:(WKWebView


    )webView decidePolicyForNavigationResponse 🙁 WKNavigationResponse

    )navigationResponse decisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler; “`

    1. decisionHandler块在应用已经决定允许或取消页面加载时调用3.这个块携带一个参数,是WKNavigationResponsePolicy枚举类型4。WKNavigationResponsePolicy枚举类型包括WKNavigationResponsePolicyCancel取消和WKNavigationResponsePolicyAllow允许两个枚举值5。

你可以立即调用该block或者保存block并在以后的时间异步调用它。


WKNavigation


WKNavigation对象包含了跟踪页面加载过程的信息

WebView的load方法会返回一个WKNavigation对象,并会将其传递给WKNavigationDelegate的方法,从开始到结束唯一地标识一个网页加载过程。它没有自己的方法或属性。


WKNavigationActionPolicy


WKNavigationActionPolicyCancel 取消请求

WKNavigationActionPolicyAllow 允许继续


WKNavigationResponsePolicy


WKNavigationResponsePolicyCancel 取消加载

WKNavigationResponsePolicyAllow 允许继续


WKNavigationAction


WKNavigationAction对象包含了可能导致一次加载的操作的信息,用于

制定策略决策。

加载的请求信息

@property(nonatomic, readonly, copy) NSURLRequest *request;

产生这次请求的frame信息

@property(nonatomic, readonly, copy) WKFrameInfo *sourceFrame;

请求的目标frame,如果时一个新的窗口请求则是nil

@property(nonatomic, readonly, copy) WKFrameInfo *targetFrame;

触发本次浏览请求的操作类型。见WKNavigationType枚举

@property(nonatomic, readonly) WKNavigationType navigationType;


WKNavigationType

  • WKNavigationTypeLinkActivated 带有href属性的链接被用户激活

    WKNavigationTypeFormSubmitted 一个表单提交

    WKNavigationTypeBackForward 向前向后的导航请求

    WKNavigationTypeReload 网页重新加载

    WKNavigationTypeFormResubmitted 重新提交表单(例如后退、前进或重新加载)

    WKNavigationTypeOther由于其他原因


WKNavigationResponse


WKNavigationResponse对象包含用于制定策略决策的浏览响应信息

指示WebKit是否可以原生地支持显示这种MIME类型

@property(nonatomic, readonly) BOOL canShowMIMEType;

指示本次加载的frame是否是main frame

@property(nonatomic, readonly, getter=isForMainFrame) BOOL forMainFrame;

frame的response信息

如果允许了一个带有无法显示的MIME类型响应,会导致浏览加载失败@property(nonatomic, readonly, copy) NSURLResponse *response;


WKUIDelegate


提供为网页展示native用户界面的方法。WebView用户界面通过实现这个协议来控制新窗口的打开,增强用户单击元素时显示的默认菜单项的表现,并执行其他用户界面相关的任务。这些方法可以通过处理JavaScript或其他插件内容来调用。默认每个WebView一个窗口,如果需要实现一个非常规用户界面,需要依靠WKUIDelegate来实现。

创建一个新的WebView

  1. configuration是创建新WebView的配置
- (WKWebView *)webView:(WKWebView
    *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
  1. navigationAction是触发本次调用的操作
  2. windowFeatures是本次请求的窗口属性
  3. 创建的新WebView一定要使用指定的configuration
  4. WebKit将会在返回的WebView中加载请求

显示一个JavScript 警告界面

  1. message是要显示的内容

-(void)webView:(WKWebView *)webView

runJavaScriptAlertPanelWithMessage:(NSString *)message

initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void

(^)(void))completionHandler;

  1. frame的JavaScript进程发起这次调用
  2. 在警告界面被解除之后调用completionHandler来回调给页面
  3. 为了安全,实现这个方法的时候需要注意到警告的内容是有一个特定的网站指定的,这里有一个简单的准则就是用frame.request.URL.host属性来标识这个警告。
  4. 警告应该只有一个确定按钮

显示一个JavScript 确认界面

  1. message是要显示的内容
- (void)webView:(WKWebView *)webView
    runJavaScriptConfirmPanelWithMessage:(NSString *)message
    initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void
    (^)(BOOL result))completionHandler;
  1. frame的JavaScript进程发起这次调用
  2. 在确认界面被解除之后调用completionHandler来回调给页面,点击确定传YES,取消传NO
  3. 为了安全,实现这个方法的时候需要注意到确认的内容是有一个特定的网站指定的,这里有一个简单的准则就是用frame.request.URL.host属性来标识这个确认界面
  4. 确认界面应该只有两个按钮,典型的就是确认和取消

显示一个JavaScript输入界面

  1. message是要显示的内容

-(void)webView:(WKWebView *)webView

runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt

defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo

*)frame completionHandler:(void (^)(NSString *result))completionHandler;

  1. defaultText是在输入框中展示的默认文本
  2. frame的JavaScript进程发起这次调用
  3. 在输入界面被解除之后调用completionHandler来回调给页面,点击确定传输入框的文本,取消传nil
  4. 为了安全,实现这个方法的时候需要注意到确认的内容是有一个特定的网站指定的,这里有一个简单的准则就是用frame.request.URL.host属性来标识这个确认界面
  5. 确认界面应该只有两个按钮(典型的就是确认和取消)和一个输入框

通知app网页的DOM窗口已经关闭

  1. app应该从控件关系中移除这个WebView并重新安排界面的显示
- (void)webViewDidClose:(WKWebView *)webView;
  1. 例如关闭一个浏览器tab或者窗口

iOS 10.0+决定是否要预览指定的WKPreviewElementInfo

  1. 返回NO会禁止本次预览
  • (BOOL)webView:(WKWebView *)webView

    shouldPreviewElement:(WKPreviewElementInfo *)elementInfo;
  1. 这个方法只会在元素有默认的预览时调用

iOS 10.0+当用户发出了预览操作(比如3D Touch按压)时调用

  1. elementInfo是相关的预览信息
- (UIViewController *)webView:(WKWebView
    *)webView previewingViewControllerForElement:(WKPreviewElementInfo *)elementInfo defaultActions:(NSArray<id<WKPreviewActionItem>> *)previewActions;
  1. previewActions是元素使用的默认的操作选项(预览时上拉可见),比如打开链接,添加到阅读列表,拷贝链接,共享。返回nil则使用默认的预览表现
  2. 如果返回一个视图控制器则预览会显示这个视图控制器,并且在用户触发pop操作(继续按压)时触发webView:commitPreviewingViewController:

    的调用
  3. 如果要使用默认预览操作,应用程序必须在返回的视图控制器的previewActionItems实现中运行这些操作

iOS 10.0+预览时用户触发pop操作(继续按压)时调用

previewingViewController就是即将展示的预览页面


- (void)webView:(WKWebView *)webView commitPreviewingViewController:(UIViewController *)previewingViewController;


你需要将这个预览界面在界面中继续展示,以保持预览的连贯性

如果你在这里什么也不做,用户的pop操作将什么也不会改变


WKWindowFeatures


WKWindowFeatures对象指定了请求一个新WebView时的窗口的可选属性

窗口是否可以调整尺寸(Boolean)

nil表示未被指定该属性

@property(nonatomic, readonly) NSNumber *allowsResizing;

窗口的高度(CGFloat)

nil表示未指定该属性

@property(nonatomic, readonly) NSNumber *height;

窗口的宽度(CGFloat)

nil表示未指定该属性

@property(nonatomic, readonly) NSNumber *width;

窗口的x坐标(CGFloat)

nil表示未指定该属性

@property(nonatomic,只读)NSNumber * x;

窗口的y坐标(CGFloat)nil表示未指定该属性

@property(nonatomic,只读)NSNumber * y;

菜单栏是否应该可见(布尔型)nil表示未指定该属性

@property(nonatomic,只读)NSNumber * menuBarVisibility;

状态栏是否应该可见(布尔型)nil表示未指定该属性

@property(nonatomic,只读)NSNumber * statusBarVisibility;

工具栏是否应该可见(布尔型)nil表示未指定该属性

@property(nonatomic,只读)NSNumber * toolbarsVisibility;


* WKPreviewElementInfo *

WKPreviewElementInfo对象包含了预览网页的信息预览网页的链接

@property(nonatomic, readonly) NSURL *linkURL;


WKPreviewActionItem


WKPreviewActionItem协议提供预览操作的一些属性的访问方法。继承自UIPreviewActionItem。

预览操作的标志符

@property(nonatomic, copy, readonly) NSString *identifier;


UIPreviewActionItem


快速选择操作:例如3D Touch桌面图标触发,会弹出一个或多个快速选择的表单。触发后也可以滑动选择,松开选中。

一组方法定义了您可以应用于快速选择操作和快速选择操作组的样式,并定义了一个只读访问器,用于用户可见的快速选择操作的标题。

UIPreviewActionItem被 UIPreviewAction 和 UIPreviewActionGroup 类采用,请不要应用到自定义的类上。

快速选择操作的标题。系统将标题作为一个快速选择表单中的选项,当用户在上面滑动时可以看到。

@property(nonatomic, copy, readonly) NSString *title;


WKBackForwardList


一个WKBackForwardList对象维护了用户访问过的网页记录,用来前进后退到最近加载过的网页.WKBackForwardList对象仅仅维护的是列表数据,并不会执行任何实际的网页加载的操作,不会产生任何客户请求。如果你需要产生一次页面加载,请使用的loadRequest:方法这些上一个记录如果没有,则为零

@属性(非原子,只读,强)WKBackForwardListItem * backItem;

当前记录



@property(nonatomic,readonly,strong)WKBackForwardListItem * currentItem;


下一个记录如果没有,则为零

@属性(非原子,只读,强)WKBackForwardListItem * forwardItem;

相对于当前记录的位置的记录当前位置的索引为0,-1就是上一个记录,1就是下一个记录,依此类别

- (WKBackForwardListItem *)itemAtIndex:(NSInteger)index;

如果索引超出范围,则返回零当前记录之前的记录列表顺序就是访问顺序


@property(nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *backList;

当前记录之后的记录列表

顺序就是访问顺序

@property(nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *forwardList;


WKBackForwardListItem


WKBackForwardListItem对象代表了前进后退记录中的一个网页,包含了网页的一些信息(URL,标题和创建网页时的URL),前进后退记录由WKBackForwardList维护。

网页的URL

@property(readonly, copy) NSURL *URL;


创建记录时初始化传入的URL

@property(readonly, copy) NSURL *initialURL;


网页的标题

@property(readonly, copy) NSString *title;



版权声明:本文为sun2728原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。