如何使用Xamarin Form在iOS iPhone的相册内创建文件夹
Xamarin.Forms iOS端相册自定义目录实现方案
Xamarin.Forms本身没有提供跨平台API直接操作系统相册,iOS端需要依赖原生Photos框架,通过依赖服务(DependencyService)封装实现即可,具体步骤如下:
1. 配置系统权限
iOS 11及以上版本需要在iOS项目的Info.plist文件中添加相册读写权限声明:
- 添加
NSPhotoLibraryAddUsageDescription权限,值填写展示给用户的权限说明,比如「需要访问相册存储拍摄的图片」 - iOS 14及以上版本需要额外添加
NSPhotoLibraryUsageDescription权限,满足创建/读取相册目录的权限要求
2. 定义跨平台接口
在Xamarin.Forms共享项目中新建服务接口:
public interface IPhotoAlbumService { // 创建自定义相册目录,返回是否创建成功 bool CreateCustomAlbum(string albumName); // 可自行扩展保存图片到指定目录的接口方法 }
3. iOS端实现接口
在iOS平台项目中新建接口实现类,同时注册依赖服务:
using Photos; using Xamarin.Forms; // 替换为你自己的项目命名空间 [assembly: Dependency(typeof(PhotoAlbumService_iOS))] namespace YourAppName.iOS.Services { public class PhotoAlbumService_iOS : IPhotoAlbumService { public bool CreateCustomAlbum(string albumName) { // 先校验相册读写权限 var authStatus = PHPhotoLibrary.GetAuthorizationStatus(PHAuthorizationStatus.ReadWrite); if (authStatus != PHAuthorizationStatus.Authorized) { // 权限不足时同步请求权限 var tcs = new System.Threading.Tasks.TaskCompletionSource<bool>(); PHPhotoLibrary.RequestAuthorization(status => { tcs.SetResult(status == PHAuthorizationStatus.Authorized); }); tcs.Task.Wait(); if (!tcs.Task.Result) return false; } // 查找是否已存在同名相册 PHAssetCollection existAlbum = null; var fetchOptions = new PHFetchOptions { Predicate = NSPredicate.FromFormat($"title == %@", albumName) }; var fetchResult = PHAssetCollection.FetchAssetCollections( PHAssetCollectionType.Album, PHAssetCollectionSubtype.Any, fetchOptions); if (fetchResult.Count > 0) { return true; // 同名相册已存在直接返回成功 } // 不存在则新建相册 bool createResult = false; PHPhotoLibrary.SharedPhotoLibrary.PerformChanges(() => { PHAssetCollectionChangeRequest.CreateAssetCollection(albumName); }, (success, error) => { createResult = success; if (error != null) { System.Diagnostics.Debug.WriteLine($"创建相册失败:{error.LocalizedDescription}"); } }); return createResult; } } }
4. 共享项目调用
在需要创建相册目录的业务位置调用服务即可:
var albumService = DependencyService.Get<IPhotoAlbumService>(); bool createSuccess = albumService.CreateCustomAlbum("你要创建的相册名称");
补充:如果需要把拍摄的图片存入该自定义目录,可以在上述接口中扩展保存方法,创建
PHAssetCreationRequest时指定目标相册即可。
内容的提问来源于stack exchange,提问作者vivek pawar
相关产品推荐
相关产品推荐

