標籤:str block less dir nav abs 字元 ane roo
iOS開發之 WKWebVeiw使用
想用UIWebVeiw做的,但是突然想起來在iOS8中出了一個新的WKWebView,算是UIWebVeiw的升級版。本著對新事物的好奇,就上網查了一下,但是找了好多個都沒說的多了詳細,於是就問Google,找文檔,看看使用方法,試用了一下,果然不錯,記錄下來,大家分享!
WKWebView的特點:
- 效能高,穩定性好,佔用的記憶體比較小,
- 支援JS互動
- 支援HTML5 新特性
- 可以添加進度條(然並卵,不好用,還是習慣第三方的)。
- 支援內建手勢,
- 據說高達60fps的重新整理頻率(不卡)
建立時候很簡單
匯入Wbkit這個類庫(WKWebVeiw包含在裡面的)
遵守協議(一般前兩個就行啦,第三個主要是與JS相關的東西,這個協議中包含一個必須實現的方法,這個方法是提高App與web端互動的關鍵,它可以直接將接收到的JS指令碼轉為OC或Swift對象--網上大神說的,我沒用過。)
@interface ViewController : UIViewController<WKNavigationDelegate,WKUIDelegate,WKScriptMessageHandler>
3.建立個WebView的對象
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds]; [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://www.baidu.com"]]]; [self.view addSubview:webView];
這裡有個注意點,網址一定要寫完整,加上https://我剛開始懶,沒有加,屋裡怎麼試都載入不出來,顯示個白屏!!血的教訓啊!!
WKWebView有兩個委託
WKWebView代理有兩個,是WKNavigationDelegate和WKUIDelegate,可以根據需要來決定用那些方法(當然使用之前不要忘了遵守協議)。
他們兩個的代理方法有好多個,不過有的不常用就不寫了,需要的自己點進去看一下就行啦。。。
1. WKNavigationDelegate來追蹤載入過程
// 頁面開始載入時調用- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;// 當內容開始返回時調用- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;// 頁面載入完成之後調用- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;// 頁面載入失敗時調用- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
WKNavigtionDelegate來進行頁面跳轉
// 接收到伺服器跳轉請求之後再執行- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;// 在收到響應後,決定是否跳轉- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;// 在發送請求之前,決定是否跳轉- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
2. WKUIDelegate
//1.建立一個新的WebVeiw- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;//2.WebVeiw關閉(9.0中的新方法)- (void)webViewDidClose:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);//3.顯示一個JS的Alert(與JS互動)- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;//4.彈出一個輸入框(與JS互動的)- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;//5.顯示一個確認框(JS的)- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
(PS:WKUIDelegate主要是做跟網頁互動的,可以顯示javascript的一些alert或者Action,看起來跟自己做的一樣的.)
暫時就用到了這麼多,這個demo純粹是為了初學實驗的,具體複雜的使用方法等以後遇到了再說啊!!!!
這篇文章寫得非常詳細,大家也可以參考下
2016.11.26補充
補充載入頁面後自動關閉的問題
問題描述,我載入一web頁面後,進行各種操作,比說我儲值,什麼的,然後想要在儲值提出成功後自頂關閉這個web頁面回到上一層或者返回到某一個介面,就用下面的方法,一般判斷URL 包含的字串都是後台給定的,在這裡只需要判斷就好了!
//**WKNavigationDelegate**裡面的代理方法(上面有)- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ //擷取請求的url路徑. NSString *requestString = navigationResponse.response.URL.absoluteString; WKLog(@"requestString:%@",requestString); // 遇到要做出改變的字串 NSString *subStr = @"www.baidu.com"; if ([requestString rangeOfString:subStr].location != NSNotFound) { WKLog(@"這個字串中有subStr"); //回調的URL中如果含有百度,就直接返回,也就是關閉了webView介面 [self.navigationController popViewControllerAnimated:YES]; } decisionHandler(WKNavigationResponsePolicyAllow);}
iOS開發之WKWebView簡單使用和常用使用情境