前段時間做了一個網頁下載的功能,需求是這樣的,點擊原生頁面一個按鈕然后打開wkwebview,在此H5頁面填寫信息,點擊提交按鈕跳轉到下一個H5頁面,這個H5頁面有個下載按鈕,點擊下載按鈕沒有反應。
就是這么個情況,然后先解決唄,一頓百度,找到這些資料
-(void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{ if(webView != self.webView) { decisionHandler(WKNavigationActionPolicyAllow); return; } NSURL * url = navigationAction.request.URL; UIApplication *app = [UIApplication sharedApplication]; // appstorte if ([url.absoluteString containsString:@"itunes.apple.com"]) { if ([app canOpenURL:url]) { [app openURL:url options:@{} completionHandler:^(BOOL success) { }]; decisionHandler(WKNavigationActionPolicyCancel); return; } } if (!navigationAction.targetFrame.isMainFrame) { [self.webView loadRequest:navigationAction.request]; } // appstore的外的包 if ([url.absoluteString containsString:@"itms-services://"]) { [app openURL:url options:@{} completionHandler:^(BOOL success) { }]; decisionHandler(WKNavigationActionPolicyCancel); return; } decisionHandler(WKNavigationActionPolicyAllow); }
然並卵。。。。。
但是這些資料也指出了一個解決問題的點,到下載的時候H5 鏈接是一定包含這個字段的 “
itms-services://
”
但是這個鏈接又不是一個網頁,跳轉不過去的,那么能不能找到這個鏈接前的一個H5頁面呢?答案是當然可以,所以解決了
先設置屬性用來保存H5地址
@property (nonatomic, copy) NSString *strWithNetURL;
wkwebview有個代理方法,這個方法是每次網頁請求完才會調用,如果請求失敗就不會調用,所有用來保存最后一次正常的網頁再好不過
#pragma mark - 在響應完成時,調用的方法。如果設置為不允許響應,web內 容就不會傳過來 - (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler{ NSLog(@"收到響應%@",navigationResponse.response.URL.absoluteString); self.strWithNetURL = navigationResponse.response.URL.absoluteString; //允許跳轉 decisionHandler(WKNavigationResponsePolicyAllow); //不允許跳轉 //decisionHandler(WKNavigationResponsePolicyCancel); }
然后就是設置了
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{ NSLog(@"發送請求-----》%@",navigationAction.request.URL.absoluteString); NSURL *url = navigationAction.request.URL; UIApplication *application = [UIApplication sharedApplication]; // 獲得協議頭(可以自定義協議頭,根據協議頭判斷是否要執行跳轉) // NSString *scheme = navigationAction.request.URL.scheme; NSString *string = navigationAction.request.URL.absoluteString; //跳轉APPstrong if ([string containsString:@"itunes.apple.com"]) { [application openURL:[NSURL URLWithString:string]]; decisionHandler(WKNavigationActionPolicyCancel); return; } //跳轉到Safari去下載 if ([string containsString:@"itms-services://"]) { [application openURL:[NSURL URLWithString:self.strWithNetURL]]; // 不允許web內跳轉 decisionHandler(WKNavigationActionPolicyCancel); return; } // 調用電話 if ([url.scheme isEqualToString:@"tel"]) { if ([application canOpenURL:url]) { [application openURL:url]; decisionHandler(WKNavigationActionPolicyCancel); return; } } decisionHandler(WKNavigationActionPolicyAllow); }
諾,解決了
