咨询MAUI中iOS On Demand Resource及Android资源配置方法
.NET 9 MAUI 配置 iOS 按需资源(On Demand Resources)与 Android Asset Packs
iOS 端配置按需资源
MAUI 默认的可视化资源管理界面未提供直接设置 On Demand Resource Tags 的选项,你可以通过手动编辑项目文件(.csproj)来完成配置:
- 定位到需要设为按需资源的文件条目,将其
BuildAction设为BundleResource,同时添加OnDemandResourceTags元数据指定资源标签:
<ItemGroup> <BundleResource Include="Resources\OnDemand\HighResImages\Banner.png"> <OnDemandResourceTags>FeatureImages</OnDemandResourceTags> </BundleResource> <BundleResource Include="Resources\OnDemand\Audio\Tutorial.mp3"> <OnDemandResourceTags>AudioAssets</OnDemandResourceTags> </BundleResource> </ItemGroup>
- 代码调用逻辑与 Xamarin.Forms 一致,使用
NSBundleResourceRequest发起资源请求:
using Foundation; ... var resourceRequest = new NSBundleResourceRequest(new NSSet("FeatureImages")); await resourceRequest.BeginAccessingResourcesAsync(); // 资源已就绪,执行后续操作 // 例如加载图片:var image = UIImage.FromBundle("Resources/OnDemand/HighResImages/Banner.png"); resourceRequest.EndAccessingResources();
Android 端配置 Asset Packs
.NET 9 MAUI 已支持 Android App Bundle 的 Asset Packs,配置步骤如下:
- 创建 Asset Pack 模块:在解决方案中新增一个 Android Library 项目作为 Asset Pack,将需要按需下载的资源放到该项目的
Assets目录下。 - 配置 Asset Pack 属性:编辑 Asset Pack 项目的
.csproj,设置资源包类型与交付模式:
<PropertyGroup> <AndroidAssetPackType>on-demand</AndroidAssetPackType> <AndroidAssetPackDeliveryMode>on-demand</AndroidAssetPackDeliveryMode> <AndroidAssetPackName>com.yourcompany.yourapp.featureimagespack</AndroidAssetPackName> </PropertyGroup>
- 关联主项目与 Asset Pack:在 MAUI 主项目的
.csproj中添加项目引用并声明 Asset Pack:
<ItemGroup> <ProjectReference Include="..\FeatureImagesPack\FeatureImagesPack.csproj" /> </ItemGroup> <PropertyGroup> <AndroidAssetPacks>com.yourcompany.yourapp.featureimagespack</AndroidAssetPacks> </PropertyGroup>
- 代码中请求下载:使用
SplitInstallManager发起资源包下载请求:
using Google.Play.Core.AppUpdate; ... var splitInstallManager = SplitInstallManagerFactory.Create(Android.App.Application.Context); var request = SplitInstallRequest.NewBuilder() .AddModule("featureimagespack") .Build(); var stateListener = new SplitInstallStateUpdatedListener(state => { if (state.Status == SplitInstallStatus.Downloaded) { // 资源已下载,可通过 Assets 目录访问 using var assetStream = Android.App.Application.Context.Assets.Open("Banner.png"); // 处理资源流 } }); splitInstallManager.RegisterListener(stateListener); await splitInstallManager.StartInstallAsync(request);
内容的提问来源于stack exchange,提问作者Sebastian
相关产品推荐
相关产品推荐

