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

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平台

  1. 将应用上传至Google Play控制台的内部测试轨道
  2. 邀请测试账号加入测试列表
  3. 使用测试账号在目标设备上从Play商店下载应用
  4. 发布新版本到内部测试轨道,待审核通过后即可触发更新检查

iOS平台

  1. 将应用上传至App Store Connect的TestFlight
  2. 邀请测试人员加入测试
  3. 使用测试设备安装TestFlight版本
  4. 发布新版本到TestFlight,测试人员即可收到更新提示

注意事项

  • 调试构建无法触发真实的Play Store/App Store更新检查,必须使用商店分发的测试版本
  • Android的IMMEDIATE更新类型会强制下载并安装更新,用户无法取消;若需用户确认,可使用FLEXIBLE类型
  • iOS的应用内更新最终会跳转至App Store,无法直接在应用内完成安装

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 16:08:16