sp-react-native-in-app-updates集成报错,求正确实现指导
应用内更新功能修复指南
错误原因分析
Android物理设备报错 (-10: ERROR_APP_NOT_OWNED)
- 该错误说明当前设备上的应用并非从Google Play商店获取,Play Core库仅支持识别通过Play商店安装的应用更新,调试构建或侧载APK无法触发正常的更新检查流程。
Android模拟器报错 (-6: ERROR_INSTALL_NOT_ALLOWED)
- 模拟器通常存在Play服务配置不完善的问题,或设备状态不符合更新要求(如存储空间不足、电量过低);此外,调试构建在模拟器上无法被Play Core正确识别为可更新应用。
代码修复步骤
1. 修正react-native-device-info.js的包名获取逻辑
当前代码在Android平台错误返回iOS的Bundle Identifier,导致Play Store无法匹配到正确应用,修改如下:
import Constants from "expo-constants" export const getBundleId = () => { // Android使用packageName,iOS使用bundleIdentifier return Constants.expoConfig?.android?.package ?? Constants.expoConfig?.ios?.bundleIdentifier ?? ''; } export const getVersion = () => { return Constants.expoConfig?.version } export default { getBundleId, getVersion, };
2. 优化checkAppUpdate.ts的错误处理与逻辑
统一使用async/await写法,添加错误类型判断并给出用户友好提示,调整调试模式方便测试:
import SpInAppUpdates, { IAUUpdateKind, StartUpdateOptions, IAUInstallStatus, IAUErrorCode, } from "sp-react-native-in-app-updates"; import { Platform, Alert } from "react-native"; export const checkForUpdate = async () => { // 开发阶段开启isDebug,可模拟更新流程 const inAppUpdates = new SpInAppUpdates(__DEV__); try { console.log("检查应用更新中..."); const result = await inAppUpdates.checkNeedsUpdate(); if (result.shouldUpdate) { let updateOptions: StartUpdateOptions = {}; if (Platform.OS === "android") { updateOptions = { updateType: IAUUpdateKind.IMMEDIATE, }; } else if (Platform.OS === "ios") { updateOptions = { title: "发现新版本", message: "应用有可用更新,是否前往App Store下载?", buttonUpgradeText: "立即更新", buttonCancelText: "稍后再说", }; } const updateListener = inAppUpdates.addStatusUpdateListener((downloadStatus) => { console.log("下载状态:", downloadStatus); if (downloadStatus.status === IAUInstallStatus.DOWNLOADED) { console.log("下载完成,准备安装"); inAppUpdates.installUpdate(); updateListener.remove(); } }); inAppUpdates.startUpdate(updateOptions); } else { console.log("当前已是最新版本"); } } catch (error: any) { console.error("更新检查失败:", error); // 根据错误码给出针对性提示 if (error.code === IAUErrorCode.ERROR_APP_NOT_OWNED) { Alert.alert("提示", "请通过Google Play商店安装应用以获取更新功能"); } else if (error.code === IAUErrorCode.ERROR_INSTALL_NOT_ALLOWED) { Alert.alert("提示", "当前设备状态无法进行更新,请检查存储空间或电量"); } else { Alert.alert("提示", "更新检查失败,请稍后重试"); } } };
3. babel.config.js无需修改
当前的别名配置逻辑正常,只需确保react-native-device-info的实现正确即可。
正确测试流程
Android平台
- 将应用上传至Google Play控制台的内部测试轨道
- 邀请测试账号加入测试列表
- 使用测试账号在目标设备上从Play商店下载应用
- 发布新版本到内部测试轨道,待审核通过后即可触发更新检查
iOS平台
- 将应用上传至App Store Connect的TestFlight
- 邀请测试人员加入测试
- 使用测试设备安装TestFlight版本
- 发布新版本到TestFlight,测试人员即可收到更新提示
注意事项
- 调试构建无法触发真实的Play Store/App Store更新检查,必须使用商店分发的测试版本
- Android的
IMMEDIATE更新类型会强制下载并安装更新,用户无法取消;若需用户确认,可使用FLEXIBLE类型 - iOS的应用内更新最终会跳转至App Store,无法直接在应用内完成安装
内容的提问来源于stack exchange,提问作者Hasib
相关产品推荐
相关产品推荐

