In apps that run in iOS 8 and later, use the WKWebView class instead of using UIWebView. Additionally, consider setting the WKPreferences property javaScriptEnabled to NO if you render files that are not supposed to run JavaScript.
這是Apple Library里UIWebView部分的note蕊退,也就是說(shuō)從iOS8開(kāi)始伐蒋,建議使用WKWebView替代UIWebView叔汁,就像UIAlertViewController替代UIAlertView一樣黍图,這次正好要做一個(gè)H5的頁(yè)面和APP進(jìn)行交互咱枉,相比于UIWebView纤泵,WK的加載速度快了一倍用狱,但占用的內(nèi)存卻少了译仗,WK也新增了一些方法,使用起來(lái)更方便略号,下面就說(shuō)說(shuō)WKWebView的基本使用刑峡,來(lái)實(shí)現(xiàn)簡(jiǎn)單的web頁(yè)面交互
上代碼:
1、首先得引入庫(kù)文件玄柠,WKWebView是WebKit的突梦,#import <WebKit/WebKit.h>
2、聲明屬性:@property (strong,nonatomic) WKWebView *webView;
3羽利、初始化: _webView = [[WKWebView alloc]initWithFrame:[UIScreen mainScreen].bounds];
4宫患、說(shuō)一說(shuō)如何添加透明的網(wǎng)頁(yè),以前可能設(shè)置背景色為clearColor就可以这弧,但是WK不行:_webView.backgroundColor = [UIColor clearColor];
_webView.opaque = NO;
5娃闲、設(shè)置代理,WK有兩個(gè)代理WKUIDelegate,WKNavigationDelegate,交互涉及到的主要的第二個(gè)里面的代理方法匾浪,所以:_webView.navigationDelegate = self;
6皇帮、開(kāi)始加載web內(nèi)容:NSURLRequest *request =[NSURLRequest requestWithURL:[NSURL URLWithString:alertObj[@"h5"]]];
[_webView loadRequest:request];
7、加載完畢蛋辈,顯示網(wǎng)頁(yè)
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
[[UIApplication sharedApplication].keyWindow addSubview:_webView];
}
接下里就是交互部分了
這里主要用到的是用戶點(diǎn)擊web頁(yè)面的按鈕属拾,App攔截下來(lái),在App端進(jìn)行處理
當(dāng)用戶點(diǎn)擊頁(yè)面的按鈕冷溶,會(huì)走 - (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler渐白;這個(gè)代理函數(shù),我們就在這里面進(jìn)行攔截逞频。
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSURL *responseUrl = navigationAction.request.URL;
NSString *urlStr = [responseUrl absoluteString];
if ([[responseUrl scheme] isEqualToString:baseUrlScheme]) {
if ([urlStr containsString:baseShareUrlPath]) {
//點(diǎn)擊立即分享
[VPKCShare showShareWithPlatformImages:@[@"fx_pengyouquan"]];
decisionHandler(WKNavigationActionPolicyCancel);
} else if([responseUrl.path containsString:baseCloseUrlPath]){
//點(diǎn)擊關(guān)閉
[_webView removeFromSuperview];
decisionHandler(WKNavigationActionPolicyCancel);
} else if([responseUrl.path containsString:baseGetUrlPath]){
//點(diǎn)擊立即領(lǐng)取
decisionHandler(WKNavigationActionPolicyAllow);
} else {
decisionHandler(WKNavigationActionPolicyAllow);
}
} else {
decisionHandler(WKNavigationActionPolicyAllow);
}
}
就是將要跳轉(zhuǎn)的url拿來(lái)進(jìn)行比較礼预,如果是我們要攔截的url,就執(zhí)行decisionHandler(WKNavigationActionPolicyCancel);如果不是虏劲,就執(zhí)行decisionHandler(WKNavigationActionPolicyAllow);就像UIWebView里的代理海曙返回YES和NO一樣托酸,這個(gè)是一定要寫的褒颈,不然程序就會(huì)崩潰。
關(guān)于交互励堡,還有兩個(gè)類似的代理函數(shù)
1谷丸、收到服務(wù)器的response后調(diào)用 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
2、服務(wù)器redirect時(shí)調(diào)用 - (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(null_unspecified WKNavigation *)navigation;