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

Expo iOS应用保存图片报错:需获取全部相册权限问题排查

Expo iOS端保存图片权限问题排查

我用Expo开发了一款应用,iOS端用户下载图片时,Bugsnag捕获到如下错误:

执行此操作需要访问所有照片的权限。

我并非iPhone用户,借他人设备复现了该错误,但用户端无明显异常。

随后我发现自己在app.config.json中遗漏了以下配置:

export default {
  ...
  "plugins": [
    [
      "expo-media-library",
      {
        "photosPermission": "Allow $(PRODUCT_NAME) to access your photos.",
        "savePhotosPermission": "Allow $(PRODUCT_NAME) to save photos."
      }
    ]
  ]
}

添加配置后,TestFlight测试版本的问题似乎得到解决(推测是用户卸载重装所致),但应用上架商店后,该错误仍持续出现。我本以为应用会重新请求权限,但不知如何实现。

以下是我注册权限及下载图片的代码:

import * as MediaLibrary from 'expo-media-library';
import * as FileSystem from 'expo-file-system';
import logger from '~application/utility/logger';

const albumName = "MyApplicationName";

const download = async (uri, fileName, headers, callback) => {
    registerLibraryPermissions()
        .then((granted) => granted ? downloadFile(uri, fileName, headers, callback) : null)
};

const downloadFile = async (uri, fileName, headers, callback) => {
    if (Object.keys(headers).length === 0) return null;
    try {
        return FileSystem.createDownloadResumable(uri, FileSystem.documentDirectory + fileName, {headers: headers}, callback)
            .downloadAsync()
            .then(({uri}) => moveToGallery(uri))
            .catch(error => logger.log("Error downloading the file", error));
    } catch (error) {
        logger.log("Error while downloading the photo", error)
    }
}

const moveToGallery = async (localUri) => {
    try {
        const asset = await MediaLibrary.createAssetAsync(localUri);
        return await MediaLibrary.getAlbumAsync(albumName).then(album => {
            if (album !== null) {
                return MediaLibrary.addAssetsToAlbumAsync([asset], album, false)
                    .catch((error) => logger.log('Error while adding photo', error));
            }

            return MediaLibrary.createAlbumAsync(albumName, asset, false)
                .catch((error) => logger.log('Error while saving photo', error));
        });

    } catch (error) {
        logger.log('Error while saving photo', error)
    }

}

const registerLibraryPermissions = async () => {
    try {
        const {status: existingStatus} = await MediaLibrary.getPermissionsAsync();
        let finalStatus = existingStatus;

        if (existingStatus !== 'granted') {
            const {status} = await MediaLibrary.requestPermissionsAsync();
            finalStatus = status;
        }

        if (finalStatus !== 'granted') {
            alert("L'accès à la média libairie n'a pas pu être activé sur votre téléphone");
            return false;
        }

        return true;
    } catch (error) {
        logger.log('Error getting the permissions for media library', error);
    }
};

export default {
    download,
};

iOS照片权限设置界面

请问我是否遗漏了什么?感谢解答!

内容的提问来源于stack exchange,提问作者Clément Baconnier

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:01:10