iOS wkwebview點擊下載鏈接跳轉Safari失敗


前段時間做了一個網頁下載的功能,需求是這樣的,點擊原生頁面一個按鈕然后打開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);
    
}

諾,解決了

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM