Expo MediaLibrary如何申请iOS端苹果音乐及音频文件访问权限
问题根因
MediaLibrary.requestPermissionsAsync() 是expo-media-library库提供的照片/视频类媒体权限申请方法,在iOS端仅会触发系统照片库的权限弹窗,本身不覆盖苹果音乐(Apple Music)、本地存储音频文件的访问权限——iOS系统将照片资源、音频媒体资源的权限做了完全拆分,两类权限需要单独申请,无法通过同一个方法一次性触发。
具体操作步骤
- 第一步:配置iOS权限描述
不管是原生iOS项目还是跨端项目,必须先在iOS配置中添加权限用途说明,否则调用权限申请方法会直接崩溃,提交App Store也会被审核驳回:
打开项目的Info.plist文件(Expo托管项目在app.json/app.config.js的ios.infoPlist字段下配置),添加NSAppleMusicUsageDescription字段,值填写你访问用户音频资源的具体用途,例如「需要访问媒体库以读取本地音频文件,提供音频播放功能」。 - 第二步:调用音频媒体权限的专用申请方法
不要使用MediaLibrary的权限接口申请音频访问权限,根据你的技术栈选择对应调用方式:- 原生Swift项目:导入MediaPlayer框架,调用MPMediaLibrary的权限申请接口
import MediaPlayer // 触发苹果音乐/本地音频权限弹窗 MPMediaLibrary.requestAuthorization { authStatus in switch authStatus { case .authorized: // 权限已通过,可正常读取本地音频、Apple Music资源 case .denied, .restricted: // 权限被拒绝,引导用户到系统设置手动开启 case .notDetermined: // 用户尚未做出选择,可后续再次触发申请 @unknown default: break } }- React Native/Expo项目:安装
expo-apple-music依赖后,调用库提供的权限方法即可
import * as AppleMusic from 'expo-apple-music'; const requestAudioPermission = async () => { const { status } = await AppleMusic.requestPermissionsAsync(); if (status === 'granted') { // 权限通过 } } - 第三步:权限拒绝后的兜底处理
如果用户已经拒绝过权限,再次调用申请方法不会触发系统弹窗,此时直接引导用户跳转到系统应用设置页手动开启权限即可,跳转代码示例(React Native):import { Linking } from 'react-native'; // 跳转至当前应用的系统设置页 Linking.openSettings();
注意:iOS 14及以上版本不需要额外配置其他存储类权限,只要
NSAppleMusicUsageDescription配置正确、MPMediaLibrary权限申请通过,就可以正常读取本地所有音频文件和Apple Music授权资源,和照片权限的授权状态完全无关。
内容的提问来源于stack exchange,提问作者Hédi Ben Chiboub
相关产品推荐
相关产品推荐

