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, };

请问我是否遗漏了什么?感谢解答!
内容的提问来源于stack exchange,提问作者Clément Baconnier
相关产品推荐
相关产品推荐

