React Native Expo托管应用expo-sharing分享不可用如何解决?
问题说明
当前使用环境信息:
- Expo SDK v.45
- 测试设备:iPhone 13 Pro(iOS v.15.5)
- 依赖版本:expo-sharing v.10.1.1
- 调试方式:执行
expo start --dev-client在iPhone真机调试
需求为实现应用内生成文件外部分享,引入expo-sharing后执行Sharing.isAvailableAsync()始终返回false,控制台输出Not available,无法正常使用分享能力。
解决步骤
- 修正现有代码错误
首先贴出的代码存在两处基础错误,会直接导致功能异常:
- 导入语句关键字错误:
install * as Sharing from 'expo-sharing'是笔误,正确导入写法为
import * as Sharing from 'expo-sharing';
useEffect不支持直接传入async回调,会导致返回的Promise被误判为组件清理函数,正确写法为:
useEffect(() => { const checkShareStatus = async () => { const canShare = await Sharing.isAvailableAsync(); console.log(canShare ? "available" : "Not available"); }; checkShareStatus(); }, []);
- 完成dev-client模式下的原生模块编译
使用自定义开发客户端而非Expo Go调试时,expo-sharing包含原生代码,必须重新编译客户端才能加载对应模块:
- 执行
expo install expo-sharing确认依赖版本与当前Expo SDK 45匹配,避免版本不兼容问题 - 执行
expo prebuild --clean清理旧的原生构建配置,自动生成包含expo-sharing原生依赖的iOS项目配置 - 进入iOS项目目录执行
npx pod-install同步iOS端原生依赖,之后执行expo run:ios --device将重新编译的开发客户端安装到测试iPhone上
- 补全iOS必要权限配置
iOS 15系统对文件访问权限校验严格,如果你需要分享沙盒外的文件(比如相册内文件),需要在项目根目录的app.json中补全权限描述:
{ "expo": { "ios": { "infoPlist": { "NSPhotoLibraryUsageDescription": "需要读取文件以完成分享操作", "NSPhotoLibraryAddUsageDescription": "需要保存文件以完成分享操作" } } } }
注意:所有涉及原生配置、依赖变更的操作,修改后都必须重新编译开发客户端才能生效,热更新/热重载不会同步原生层的改动。
完成以上操作后重新打开应用,Sharing.isAvailableAsync()会正常返回true,后续调用Sharing.shareAsync(本地文件路径, 分享配置参数)即可正常唤起系统分享面板。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

