You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI iOS WebView文件下载功能实现方案咨询

MAUI iOS WebView 处理带Content-Disposition的文件下载

要解决iOS端WebView直接打开带Content-Disposition响应头文件的问题,需要通过平台特定代码实现IWKDownloadDelegate接口,接管下载流程并调用系统默认应用打开文件,具体实现步骤如下:

1. 自定义WKDownloadDelegate实现类

在页面类中添加iOS专属的下载委托类,实现文件路径指定和下载完成后的打开逻辑:

#if IOS
using WebKit;
using Foundation;
using UIKit;

public class CustomWKDownloadDelegate : NSObject, IWKDownloadDelegate
{
    [Export("download:decideDestinationUsingResponse:suggestedFilename:completionHandler:")]
    public void DecideDestination(WKDownload download, NSUrlResponse response, string suggestedFilename, Action<string, bool> completionHandler)
    {
        // 将文件保存到iOS临时目录
        var tempDir = NSTemporaryDirectory();
        var filePath = Path.Combine(tempDir, suggestedFilename);
        
        // 通知WebView使用指定路径保存文件
        completionHandler(filePath, false);
    }

    [Export("downloadDidFinishDownloading:destinationURL:")]
    public void DidFinishDownloading(WKDownload download, NSUrl destinationUrl)
    {
        // 初始化文件交互控制器,调用系统默认应用打开文件
        var docController = new UIDocumentInteractionController();
        docController.Url = destinationUrl;
        
        // 获取当前顶层视图控制器
        var viewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
        while (viewController.PresentedViewController != null)
        {
            viewController = viewController.PresentedViewController;
        }
        
        // 弹出文件打开选项菜单
        docController.PresentOpenInMenu(viewController.View.Bounds, viewController.View, true);
    }
}
#endif

2. 配置WebView的下载委托

修改页面的OnHandlerChanged方法,将自定义委托绑定到WKWebView的配置中:

public partial class WebClientPage : ContentPage
{
    public WebClientPage()
    {
        InitializeComponent();
    }

    protected override void OnHandlerChanged()
    {
        base.OnHandlerChanged();

#if IOS
        var iosWebView = WebView.Handler.PlatformView as WebKit.WKWebView;
        if (iosWebView != null)
        {
            iosWebView.AllowsBackForwardNavigationGestures = true;
            // 绑定自定义下载委托
            iosWebView.Configuration.DownloadDelegate = new CustomWKDownloadDelegate();
        }
#endif
    }
}

注意事项

  • 临时目录的文件会被系统定期清理,若需要永久保存文件,可将保存路径修改为Documents目录,但需在Info.plist中配置对应的文件访问权限。
  • UIDocumentInteractionController会根据文件类型自动匹配系统默认应用,无需额外配置文件关联逻辑。

内容的提问来源于stack exchange,提问作者Edgar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:22:10