美文网首页日常收录
iOS WKWebView 对 blob Url 的下载文件处

iOS WKWebView 对 blob Url 的下载文件处

作者: 激动的厨师 | 来源:发表于2023-05-25 11:35 被阅读0次

    记录一次H5生成blob文件url,iOS app内部WKWebView不能正常下载问题。
    因为我发现在系统浏览器Safari里能下载,按理说在WKWebView里也能,后来查了下资料解决了这个问题。
    1.首先要拦截跳转把以blob开头的跳转链接转成WKNavigationActionPolicyDownload 代码如下,注意这个只能在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.然后实现代理方法

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

    3.最后实现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;
            });
          //这里是分享文件 封的一个方法,内部用的UIActivityViewController ,下面顺便会把分享代码也贴出来
            [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) {//保存到相册
                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];
    }
    

    总结:这个功能只能在iOS14.5以上才能使用,因为网上关于iOS处理的资料有点少,就特地分享出来。希望能帮到iOS开发小伙伴们。

    相关文章

      网友评论

        本文标题:iOS WKWebView 对 blob Url 的下载文件处

        本文链接:https://www.haomeiwen.com/subject/iulhedtx.html