iOS WKWebView 對(duì) blob Url 的下載文件處理

記錄一次H5生成blob文件url,iOS app內(nèi)部WKWebView不能正常下載問(wèn)題。
因?yàn)槲野l(fā)現(xiàn)在系統(tǒng)瀏覽器Safari里能下載,按理說(shuō)在WKWebView里也能,后來(lái)查了下資料解決了這個(gè)問(wèn)題。
1.首先要攔截跳轉(zhuǎn)把以blob開(kāi)頭的跳轉(zhuǎn)鏈接轉(zhuǎn)成WKNavigationActionPolicyDownload 代碼如下,注意這個(gè)只能在iOS14.5以后才能使用

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
  if([navigationAction.request.URL.absoluteString hasPrefix:@"blob"]){
        if (@available(iOS 14.5, *)) {
            decisionHandler(WKNavigationActionPolicyDownload);
        } else {
            // Fallback on earlier versions
            decisionHandler(WKNavigationActionPolicyCancel);
        }
    }
    else{
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}

2.然后實(shí)現(xiàn)代理方法

- (void)webView:(WKWebView *)webView navigationAction:(WKNavigationAction *)navigationAction didBecomeDownload:(WKDownload *)download API_AVAILABLE(ios(14.5)){
    download.delegate = self;// 遵守WKDownloadDelegate
}

3.最后實(shí)現(xiàn)WKDownloadDelegate代理

- (void)download:(WKDownload *)download decideDestinationUsingResponse:(NSURLResponse *)response suggestedFilename:(NSString *)suggestedFilename completionHandler:(void (^)(NSURL * _Nullable))completionHandler API_AVAILABLE(ios(14.5)){
    NSURL *temporaryDirectory = [NSFileManager.defaultManager temporaryDirectory];
    NSURL *url = [temporaryDirectory URLByAppendingPathComponent:suggestedFilename];
    completionHandler(url);
    //這里是提示框
    [ShowAlertTool showSheetwithTitles:@[@"分享文件"] confirmBlock:^(NSInteger number) {
        SHOW_HUD;
        XMainAfter(1, ^{
            DISMISS_HUD;
        });
      //這里是分享文件 封的一個(gè)方法,內(nèi)部用的UIActivityViewController ,下面順便會(huì)把分享代碼也貼出來(lái)
        [SFShare showSystemShare:@[url] completion:nil];
    }];
}

4.分享方法的代碼

+(void)showSystemShare:(NSArray *)items completion:(ShareCallBackBlock)shareBlock{
    UIActivityViewController *activityView = [[UIActivityViewController alloc] initWithActivityItems:items applicationActivities:nil];
    activityView.excludedActivityTypes = @[UIActivityTypePostToFacebook,
                                           UIActivityTypeMessage,
                                           UIActivityTypePostToTwitter,
                                           UIActivityTypePostToWeibo,
                                           UIActivityTypeMail,
                                           UIActivityTypePrint,
                                           UIActivityTypeCopyToPasteboard,
                                           UIActivityTypeAssignToContact,
//                                           UIActivityTypeSaveToCameraRoll,
                                           UIActivityTypeAddToReadingList,
                                           UIActivityTypePostToFlickr,
                                           UIActivityTypePostToVimeo,
                                           UIActivityTypePostToTencentWeibo,
                                           UIActivityTypeAirDrop,
                                           UIActivityTypeOpenInIBooks,
                                           UIActivityTypeMarkupAsPDF,
                                        ];
    activityView.completionWithItemsHandler = ^(UIActivityType __nullable activityType, BOOL completed, NSArray * __nullable returnedItems, NSError * __nullable activityError){
        if (activityType == UIActivityTypeSaveToCameraRoll) {//保存到相冊(cè)
            NSString *msg = nil ;
             if(!completed){
                 msg = @"保存圖片失敗" ;
             }else{
                 msg = @"保存圖片成功" ;
             }
             [[UIApplication sharedApplication].keyWindow makeToast:(msg) duration:1.5 position:CSToastPositionCenter];
        }
        if(shareBlock){
            shareBlock(completed);
        }
    };
    
    [[UIApplication sharedApplication].keyWindow.rootViewController presentViewController:activityView animated:YES completion:nil];
}

總結(jié):這個(gè)功能只能在iOS14.5以上才能使用,因?yàn)榫W(wǎng)上關(guān)于iOS處理的資料有點(diǎn)少,就特地分享出來(lái)。希望能幫到iOS開(kāi)發(fā)小伙伴們。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容