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

iOS端react-native-permissions获取相册权限返回unavailable的解决方法

iOS端react-native-permissions相册权限返回unavailable的解决方法

1. 匹配iOS版本选择正确的权限常量

react-native-permissions针对不同iOS版本提供了不同的相册权限常量,用错会直接返回unavailable:

  • iOS 13及以下:使用PERMISSIONS.IOS.PHOTO_LIBRARY
  • iOS 14-15:
    • 需要读取/修改全相册:用PERMISSIONS.IOS.PHOTO_LIBRARY
    • 仅需添加照片到相册:用PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY
  • iOS 16及以上:
    • 读取+写入全相册:用PERMISSIONS.IOS.PHOTO_LIBRARY_READ_WRITE(推荐)
    • 仅添加照片:用PERMISSIONS.IOS.PHOTO_LIBRARY_ADD_ONLY

2. 完善Info.plist权限描述配置

根据选择的权限常量,添加对应的描述键,注意键名拼写完全一致:

  • 若使用PHOTO_LIBRARY或PHOTO_LIBRARY_READ_WRITE:
    <key>NSPhotoLibraryUsageDescription</key>
    <string>需要访问您的相册以读取/保存媒体内容</string>
    
  • 若使用PHOTO_LIBRARY_ADD_ONLY:
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>需要访问您的相册以保存媒体内容</string>
    

3. 确认package.json配置并重新安装依赖

确保package.json中reactNativePermissionsIOS数组包含对应权限的字符串,注意首字母大写:

"reactNativePermissionsIOS": [
  "PhotoLibrary",
  "PhotoLibraryReadWrite", // iOS16+需要的话加上
  "PhotoLibraryAddOnly"     // 仅添加权限需要的话加上
]

然后执行以下命令:

cd ios
pod deintegrate
pod install
cd ..

4. 清理项目缓存

缓存可能导致配置不生效,执行以下操作:

  • 关闭Xcode和Metro服务
  • 删除iOS项目下的build文件夹
  • 重启Metro并清除缓存:
    npx react-native start --reset-cache
    
  • 重新用Xcode或npx react-native run-ios启动项目

5. 修正代码中的权限调用

统一使用async/await写法,确保权限常量正确,示例代码(以iOS16+读取写入为例):

import React from 'react';
import { View, Text, Pressable } from 'react-native';
import { check, request, PERMISSIONS, RESULTS } from 'react-native-permissions';

const App = () => {
  const requestUserMediaPermission = async () => {
    try {
      const status = await check(PERMISSIONS.IOS.PHOTO_LIBRARY_READ_WRITE);
      if (status === RESULTS.GRANTED) {
        console.log('权限已授予');
        return;
      }
      const result = await request(PERMISSIONS.IOS.PHOTO_LIBRARY_READ_WRITE);
      console.log(result);
    } catch (err) {
      console.error(err);
    }
  };

  return (
    <View style={{ backgroundColor: 'black', flex: 1, justifyContent: 'center' }}>
      <Pressable onPress={requestUserMediaPermission}>
        <Text style={{ fontWeight: 'bold', color: 'white', textAlign: 'center', fontSize: 20 }}>获取相册权限</Text>
      </Pressable>
    </View>
  );
};

export default App;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 14:57:46