iOS10之后需要添加的权限

本文详细介绍了应用程序请求访问用户设备上各种资源时所展示的提示信息,包括相机、相册、麦克风等常见权限,并解释了为何需要用户的明确授权。

// 相机

<key>NSCameraUsageDescription</key>

<string>App需要您的同意,才能访问相机</string>

// 相册

<key>NSPhotoLibraryUsageDescription</key>

<string>App需要您的同意,才能访问相册</string>

// 麦克风

<key>NSMicrophoneUsageDescription</key>

<string>App需要您的同意,才能访问麦克风</string>

// 通信录

<key>NSContactsUsageDescription</key>

<string>App需要您的同意,才能访问通信录</string>

// 位置

<key>NSLocationUsageDescription</key> 

<string>App需要您的同意,才能访问位置</string> 

//在使用期间访问位置

<key>NSLocationWhenInUseUsageDescription</key> 

<string>App需要您的同意,才能在使用期间访问位置</string> 

//始终访问位置

<key>NSLocationAlwaysUsageDescription</key> 

<string>App需要您的同意,才能始终访问位置</string>  

// 日历

<key>NSCalendarsUsageDescription</key> 

<string>App需要您的同意,才能访问日历</string> 

//提醒事项

<key>NSRemindersUsageDescription</key> 

<string>App需要您的同意,才能访问提醒事项</string>  

//运动与健身

<key>NSMotionUsageDescription</key>

<string>App需要您的同意,才能访问运动与健身</string> 

//健康更新

<key>NSHealthUpdateUsageDescription</key> 

<string>App需要您的同意,才能访问健康更新</string>  

//健康分享

<key>NSHealthShareUsageDescription</key> 

<string>App需要您的同意,才能访问健康分享</string>  

// 蓝牙

<key>NSBluetoothPeripheralUsageDescription</key> 

<string>App需要您的同意,才能访问蓝牙</string> 

//媒体资料库

<key>NSAppleMusicUsageDescription</key> 

<string>App需要您的同意,才能访问媒体资料库</string>

<think>我们正在处理iOS平台的视频文件存储权限配置,并确保兼容各个iOS版本。根据引用内容,我们可以总结出以下关键点: 1. **权限描述**:在iOS中,我们需要在`Info.plist`文件添加相应的权限描述,否则应用会被拒绝访问。对于视频存储,我们需要用到相册权限(`NSPhotoLibraryUsageDescription`)[^3][^5]。 2. **权限请求**:在代码中,我们需要使用`permission_handler`插件来请求权限iOS权限请求与Android不同,它不需要区分版本,但需要正确配置权限描述[^4]。 3. **兼容性**:从iOS 11开始,苹果引入了相册写入权限,所以我们需要确保从iOS 11到最新版本都兼容。但注意,在iOS 11之前,写入相册不需要额外权限(但需要描述),所以只需配置相册使用描述即可。 4. **权限类型**:在iOS上,我们需要请求的是`Permission.photos`(在permission_handler中)或`Permission.mediaLibrary`(用于媒体库,包括视频和音频)[^4]。但注意,在iOS 11之后,苹果将相册权限和媒体库权限合并为`PHPhotoLibrary`。因此,我们使用`Permission.photos`即可。 步骤: ### 1. 配置Info.plist 在`ios/Runner/Info.plist`中添加相册使用描述: ```xml <key>NSPhotoLibraryUsageDescription</key> <string>需要访问您的相册以保存视频。</string> ``` 如果应用需要添加视频到相册,则还需要添加写入权限(但上述描述已经包含了读写权限的请求)。在iOS 11及以上,如果要修改相册(例如创建相册),还需要添加`NSPhotoLibraryAddUsageDescription`,但如果我们只是保存视频到相册,则只需要`NSPhotoLibraryUsageDescription`。 ### 2. 使用permission_handler请求权限 在代码中,我们需要请求相册权限(`Permission.photos`)或媒体库权限(`Permission.mediaLibrary`)。根据permission_handler的文档,保存视频到相册通常使用`Permission.photos`。 注意:在iOS中,`Permission.storage`仅用于访问文件(如iCloud文件),而保存到相册需要使用`Permission.photos`。 ### 3. 请求权限的代码实现 ```dart import 'package:permission_handler/permission_handler.dart'; Future<bool> requestIOSVideoPermission() async { // 在iOS上,我们请求相册权限 var status = await Permission.photos.request(); if (status.isGranted) { return true; } else if (status.isPermanentlyDenied) { // 被永久拒绝,需要引导用户到设置开启 openAppSettings(); } return false; } ``` ### 4. 保存视频到相册 在iOS上,我们可以使用`image_picker`插件保存视频到相册,或者使用`gallery_saver`插件(专门用于保存媒体文件到相册)。 添加依赖: ```yaml dependencies: gallery_saver: ^2.3.2 ``` 保存视频的代码: ```dart import 'package:gallery_saver/gallery_saver.dart'; Future<void> saveVideoToGallery(String videoPath) async { await GallerySaver.saveVideo(videoPath, albumName: "MyApp Videos") .then((bool? success) { if (success != null && success) { print('Video saved to gallery'); } }); } ``` ### 5. 兼容性说明 - **iOS 10及以下**:虽然不需要动态请求权限(系统会自动弹出),但必须配置`NSPhotoLibraryUsageDescription`,否则应用会被拒绝。 - **iOS 11及以上**:需要动态请求权限(通过`Permission.photos`),并且用户可以选择“仅添加照片”或“允许访问所有照片”。在保存视频时,如果用户选择“仅添加照片”,则应用只能将视频保存到相册,而不能读取相册中的其他内容。这符合我们的需求(因为我们只需要保存,不需要读取)。 - **iOS 14及以上**:苹果引入了更细粒度的权限,但`Permission.photos`仍然适用,并且会请求用户允许访问所有照片或仅添加照片。我们只需要保存,所以“仅添加照片”权限就足够了。 ### 6. 完整流程 ```dart Future<void> saveVideo(File videoFile) async { // 检查权限 if (await Permission.photos.request().isGranted) { await saveVideoToGallery(videoFile.path); } else { // 处理权限被拒绝的情况 // 可以引导用户到设置 openAppSettings(); } } ``` ### 7. 注意事项 - 在iOS上,用户可能会拒绝权限,所以需要处理拒绝情况,并引导用户到设置中手动开启。 - 如果应用需要读取相册中的视频(例如选择视频),那么就需要读取权限,此时用户必须授予“允许访问所有照片”的权限。但我们的需求是保存视频,所以不需要读取权限,因此“仅添加照片”权限就足够了。 ### 8. 测试建议 - 在多个iOS版本上测试(如iOS 10, 11, 12, 13, 14, 15, 16等)。 - 测试权限被拒绝后的引导逻辑。 ### 引用说明 我们参考了以下引用: - 引用[3]和[5]提供了iOS权限描述的配置方法。 - 引用[4]提供了使用permission_handler处理权限的指导。 ### 相关问题 §§相关问题§§ 1. 在Flutter中如何实现iOS相册的读取和写入权限分离处理? 2. 如何检测用户授予的是“仅添加照片”还是“完全访问”权限? 3. 在iOS上保存视频到相册时如何创建自定义相册? 4. 如何处理iOS权限请求中的“仅添加照片”选项?</think>在 Flutter 中处理 iOS 视频文件存储权限并兼容各版本,需要遵循苹果的隐私政策并正确配置权限声明。以下是完整解决方案: ### 1. 权限配置(Info.plist) 在 `ios/Runner/Info.plist` 中添加以下权限描述: ```xml <key>NSPhotoLibraryUsageDescription</key> <string>需要访问您的相册以保存视频</string> <key>NSPhotoLibraryAddUsageDescription</key> <string>需要将视频保存到您的相册</string> ``` **版本兼容说明**: - iOS 10 及以下:只需 `NSPhotoLibraryUsageDescription` - iOS 11+:需要同时添加 `NSPhotoLibraryAddUsageDescription`(写入权限)[^3][^5] - iOS 14+:新增了"Limited Photo Library"模式,需要额外处理 ### 2. 权限请求代码 使用 `permission_handler` 插件处理动态权限请求: ```dart import 'package:permission_handler/permission_handler.dart'; Future<bool> requestIOSVideoPermissions() async { if (Platform.isIOS) { // 请求相册权限iOS 14+需要特殊处理) final status = await Permission.photos.request(); if (status == PermissionStatus.limited) { // iOS 14+ 有限访问模式处理 return _handleLimitedPhotoAccess(); } return status.isGranted; } return true; } Future<bool> _handleLimitedPhotoAccess() async { // 引导用户开启完整访问权限 final result = await showDialog( context: context, builder: (ctx) => AlertDialog( title: Text('需要完整相册访问'), content: Text('请允许访问所有照片以保存视频'), actions: [ TextButton( onPressed: () => Navigator.pop(ctx, false), child: Text('取消'), ), TextButton( onPressed: () { openAppSettings(); // 跳转到设置 Navigator.pop(ctx, true); }, child: Text('去设置'), ), ], ), ); return result == true; } ``` ### 3. 视频存储实现 ```dart import 'package:gallery_saver/gallery_saver.dart'; Future<bool> saveVideoToGallery(String videoPath) async { try { // 保存到系统相册 return await GallerySaver.saveVideo( videoPath, albumName: "MyApp Videos", // 自定义相册名 toDcim: false, // 是否保存到DCIM目录 ); } catch (e) { print('保存失败: $e'); return false; } } // 获取应用文档目录(私有存储) Future<String> getAppDocumentsPath() async { final dir = await getApplicationDocumentsDirectory(); return dir.path; } ``` ### 4. 版本兼容策略 | iOS 版本 | 权限要求 | 关键处理 | |---------|---------|---------| | ≤10 | `NSPhotoLibraryUsageDescription` | 基本权限请求 | | 11-13 | 增加 `NSPhotoLibraryAddUsageDescription` | 处理写入权限 | | 14+ | 有限照片库(Limited Photo Library) | 引导用户选择完整访问 | | 15+ | 新增最近删除项权限 | 处理恢复删除的视频 | ### 5. 完整工作流 ```dart Future<void> saveVideo(File videoFile) async { // 1. 检查权限 if (!await requestIOSVideoPermissions()) { showDialog(...); // 显示权限引导 return; } // 2. 存储到相册 final success = await saveVideoToGallery(videoFile.path); // 3. 备选方案:存储到应用私有目录 if (!success) { final appDir = await getAppDocumentsPath(); await videoFile.copy('$appDir/${DateTime.now()}.mp4'); } } ``` ### 6. 关键注意事项 1. **iOS 14+ 有限访问模式**: ```dart // 检查当前权限状态 final status = await Permission.photos.status; if (status == PermissionStatus.limited) { // 引导用户选择更多照片 } ``` 2. **自定义相册**: ```dart // 创建自定义相册(iOS 10+) await GallerySaver.createAlbum("MyApp Videos"); ``` 3. **文件系统沙盒**: - 应用私有目录:`getApplicationDocumentsDirectory()` - 临时文件:`getTemporaryDirectory()` - 缓存目录:`getApplicationSupportDirectory()` 4. **大文件处理**: ```dart // 分块保存大视频 void saveLargeVideoInChunks(File video) { const chunkSize = 1024 * 1024; // 1MB final stream = video.openRead(); // 实现分块写入逻辑 } ``` ### 7. 测试建议 1. **模拟不同iOS版本**: ```bash flutter run --release --simulator=iPhone8,ios=12.4 flutter run --release --simulator=iPhone13,ios=15.5 ``` 2. **权限场景测试**: - 首次请求权限 - 拒绝后再次请求 - "允许访问部分照片"模式 - 权限永久拒绝后引导到设置 3. **存储位置验证**: - 使用Xcode的"设备文件管理器" - 检查相册和私有目录的文件 > **最佳实践**:优先使用系统相册保存用户可见视频,敏感或临时文件存储在应用私有目录[^1][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值