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

.NET MAUI BlazorWebView中能否返回PDF并调用默认应用打开?

问题:.NET MAUI Blazor中调用设备默认PDF应用打开文件是否可行?

背景

我正在开发一款要发布到iOS和Google Play商店的APP,技术栈是.NET MAUI Blazor,整个应用在BlazorWebView中渲染,所有数据通过API获取。

需求

页面包含多个PDF下载功能,希望能调用设备上已安装的默认PDF应用打开文件,想知道是否可行。

尝试过的方案

我试过Blazor WASM的常规方法,用JavaScript函数实现(无MAUI包装时可行),但在MAUI环境里无效,没有报错但无法返回文件。希望尽量避免编写原生代码。

当前实现方案(WASM中可行):

C#代码

public async Task<File> DownloadPdf(string url, string name)
{
    using (HttpClient client = new HttpClient())
    {
        HttpResponseMessage response = await client.GetAsync(url);

        if (response.IsSuccessStatusCode)
        {
            var file = await response.Content.ReadAsByteArrayAsync();
            await JS.InvokeVoidAsync("BlazorDownloadFile", $"update.pdf", "application/pdf", file);
        }
    }
}

JavaScript代码

window.BlazorDownloadFile = (filename, contentType, content) => {
        // Create the URL
        const file = new File([content], filename, { type: contentType });
        const exportUrl = URL.createObjectURL(file);

        // Create the <a> element and click on it
        const a = document.createElement("a");
        document.body.appendChild(a);
        a.href = exportUrl;
        a.download = filename;
        a.target = "_self";
        a.click();

        // We don't need to keep the object URL, let's release the memory
        // On older versions of Safari, it seems you need to comment this line...
        URL.revokeObjectURL(exportUrl);
    }

解决方案

完全可行,无需编写原生代码,借助.NET MAUI内置的API就能实现,步骤如下:

1. 替换原有实现逻辑

放弃JS触发下载的方式,改用MAUI的FileSystem保存文件,再通过Launcher调用默认PDF应用打开:

using Microsoft.Maui.Storage;

public async Task DownloadAndOpenPdf(string url, string fileName)
{
    using var client = new HttpClient();
    var response = await client.GetAsync(url);
    
    if (!response.IsSuccessStatusCode) return;
    
    var pdfBytes = await response.Content.ReadAsByteArrayAsync();
    // 将PDF保存到设备可访问目录,自动处理重名
    var savedFilePath = await FileSystem.Current.SaveFileAsync(
        fileName, 
        new MemoryStream(pdfBytes), 
        CreationCollisionOption.GenerateUniqueName);
    
    // 调用系统默认应用打开文件
    await Launcher.OpenAsync(new OpenFileRequest
    {
        File = new ReadOnlyFile(savedFilePath)
    });
}

2. 配置必要权限

  • Android:在AndroidManifest.xml中添加存储权限(适配不同Android版本):
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" android:maxSdkVersion="33" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="32" />
    
  • iOS:在Info.plist中添加文档访问支持:
    <key>LSSupportsOpeningDocumentsInPlace</key>
    <true/>
    

原JS方案失效原因

MAUI Blazor的WebView运行在移动设备的沙箱环境中,浏览器的<a download>行为会受到系统限制,无法像纯WASM那样直接触发文件保存/打开流程,改用MAUI原生API能直接和系统文件交互,绕过这个限制。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 13:50:36