記錄一次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ā)小伙伴們。