当前位置: 首页>移动开发>正文

swiftUI 页面生命周期 wkwebview生命周期

一、概述



1.iOS 8 SDK中发布了新的WebView框架----WebKit.framework。



2.WebKit使用WKWebView来代替IOS的UIWebView和OSX的NSWebView,并且使用Nitro JavaScript引擎,这意味着所有第三方浏览器运行JavaScript将会跟safari一样快。



3.内存问题:



(1)UIWebView类的内存问题一直广受诟病,现在问题终于解决了,使用WKWebView,我们APP的内存情况基本上不会因为使用了WebView而有多少变化。



(2)通过观察设备内存变化,发现WKWebView的内存被分配到了com.apple.WebKit进程,WebView里面消耗的内存不再属于我们App的进程啦。



(3)观察Safari的内存使用情况,内存情况是一样的。看来苹果把Safari的内核开放给开发者用了。



(4)但是com.apple.WebKit的内存也一直在涨,也会堆积很多,不知道有实质上的变化没。





二、WKWebView增加的属性和方法





1.增加的属性:



(1)estimatedProgress:加载进度条,在IOS8之前我们是通过一个假的进度条来实现



(2)backForwardList:表示historyList,是只读的。



(3)WKWebViewConfiguration *configuration; 初始化webview的配置





2.增加的方法:



(1)初始化:


- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration




(2)跳到历史的某个页面

-(WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;




三、相同的属性和方法


goBack、goForward、canGoBack、canGoForward、stopLoading、loadRequest、scrollView



四、被删去的属性和方法:



1、主动调用JS的方法:



- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;



替换为:


- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *))completionHandler;




2、无法设置缓存



1.在UIWebView,使用NSURLCache,可以设置我们自己的缓存,但WKWebView不支持NSURLCache。NSURLCache完全拦截不到WKWebView的任何请求。



2.UIWebView也可以使用NSURLProtocol来实现离线缓存,在WKWebView中一样不适用。和NSURLCache不一样的是,在WKWebView中,NSURLProtocol能拦截到最初始的网页链接,比如使用LoadReqeust方法加载的网页地址或者内部自动的页面跳转。



3.唯一实现离线缓存的方法就是使用HTML5的离线缓存机制了,需要浏览器和服务器配合来实现,WKWebView支持H5离线缓存。另外不需要写任何关于离线缓存的代码。





3.类似于PhoneGap实现网页调用native界面的拦截入口没有了



(1)根据上面第2点的表述,可以使用NSURLProtocol来拦截。类似于PhoneGap实现网页调用,一般都不是HTTP协议,一般都自定义协议名称,比如callnative。要想拦截这样的协议,则不能实现以下两个方法:decidePolicyForNavigationAction、decidePolicyForNavigationResponse。



(2)可以使用WKUIDelegate的runJavaScriptAlertPanelWithMessage方法来实现传递调用,网页端调用alert方法,并且将调用链接作为message参数。然后就会被runJavaScriptAlertPanelWithMessage方法拦截到,就可以获取到调用链接了,而alert的UI现实交由我们处理,我们不做处理,只获取Message来处理页面调用。





五、需要提出的一些不同的地方:(国外文章摘录:https://github.com/ShingoFukuyama/WKWebViewTips)



1.file:///协议只能打开tmp目录下的文件。



2.在Storyboard和IB中,不能使用WKWebView。



3.JavaScript中的alert, confirm, prompt调用需要实现WKUIDelegate。



4.Cookie, Cache, Credential, WebKit data不能很容易的删除。可以综合使用以下的方法:



(1)和使用UIWebView一样,使用NSURLCache和NSHTTPCookie删除cookie和缓存。如果你使用了WKProccessPool,重新初始化它。



(2)删除Library目录中的Cookies, Caches, WebKit子文件夹。



(3)移除所有的WKWebViews。。



5.WKWebView不能和iOS7及以下系统的UIWebView共存。



  如果你想发布一个同时支持WKWebView和UIWebView的应用,iOS7以下使用UIWebView,iOS8使用WKWebView,苹果会拒绝你的发布。也就是说,如果你想使用WKWebView,就必须抛弃iOS8以下的系统。





六、delegate方法的不同





1.代理方法概述:



WKNavigationDelegate主要实现了涉及到导航跳转方面的回调方法。WKUIDelegate主要实现了涉及到界面显示的回调方法:如WKWebView的改变和js相关内容。



  



2.所有代理方法:


#pragma mark - WKUIDelegate

//WKWebVie截获JS的输入框,交由本地控件来实现,最后将输入结果通过block回调给网页
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt
    defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame
    completionHandler:(void (^)(NSString *result))completionHandler
{
返回结果");
}

//WKWebVie截获JS的选择框,交由本地控件来实现,最后将选择结果通过block回调给网页
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message
  initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler
{
    completionHandler(YES);
}

//WKWebVie截获JS的确认框,交由本地控件来实现,最后将确认点击结果通过block回调给网页
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message
  initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)())completionHandler
{
    completionHandler();
}

//网页要跳转到新的窗口来展示网页,WKWebView拦截,有我们来确定显示。
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration
   forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures
{
    return nil;
}

#pragma mark - WKNavigationDelegate

//这个代理方法表示当客户端收到服务器的响应头,根据response相关信息,可以决定这次跳转是否可以继续进行。
- (void)webView:(WKWebView *)webView
  decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse
  decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
{
    decisionHandler(WKNavigationResponsePolicyAllow);
}

//根据webView、navigationAction相关信息决定这次跳转是否可以继续进行,这些信息包含HTTP发送请求,如头部包含User-Agent,Accept
- (void)webView:(WKWebView *)webView
  decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
  decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
    decisionHandler(WKNavigationActionPolicyAllow);
}

//一个Main Frame开始显示时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation
{
    
}

//当Main Frame收到服务器的重定向请求是调用
- (void)webView:(WKWebView *)webView
    didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation
{
    
}

//当Main Frame开始加载数据,发生错误时调用
- (void)webView:(WKWebView *)webView
    didFailProvisionalNavigation:(WKNavigation *)navigation
    withError:(NSError *)error
{
    
}

//当Main Frame的内容开始到达时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation{
    
}

//当完成一个Main Frame加载时调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
    
}

//当一个完成加载的MainFrame发生错误时调用
- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error
{
    
}

//处理证书相关的东西
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
{
    
}




https://www.xamrdz.com/mobile/4hh1957435.html

相关文章: