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

React Native基于LPA实现eSIM:iOS激活失败问题求助

iOS端React Native唤起eSIM激活流程失败排查与解决建议

问题背景

我们尝试在React Native App内通过按钮唤起原生eSIM激活流程,使用react-native-sim-cards-manager库时遇到iOS端错误:

CTCellularPlanProvisioningAddPlanResultUnknown - Can't setup eSim due to unknown error

已知eSIM激活分为运营商应用和LPA应用两种流程,我们已生成可正常激活的LPA格式二维码字符串:LPA:1$${smdp_address}$${activation_code}$$1,但以下两种方案均未成功:

  1. 使用Linking.openURL()打开LPA链接
  2. 开发自定义Objective-C Native模块调用CoreTelephony接口,目前提示“Unable to activate eSIM”
    后端服务采用Truphone,寻求针对性解决建议。

一、直接通过Linking.openURL()唤起LPA链接的优化方案

  • 校验LPA链接格式:确保变量替换后的链接完整匹配二维码格式,比如实际生成的链接应为LPA:1$smdp.truphone.com$XXXXXXXXX$1,无多余占位符或格式错误。
  • 配置Info.plist白名单:iOS 9+需在Info.plist的LSApplicationQueriesSchemes数组中添加"lpa",确保App有权限唤起系统LPA处理流程。
  • 验证链接有效性:先将生成的LPA链接复制到Safari中打开,若Safari也无法唤起激活流程,说明链接本身存在问题,需核对Truphone提供的SMDP地址和激活码准确性。

二、自定义Native模块的问题修复与调试

1. 修正LPA地址格式错误

你的代码中生成的addressLPA仅拼接了3个部分,缺少二维码格式中的最后一段$1,导致格式不匹配系统要求,修改代码如下:

NSString *addressLPA = [NSString stringWithFormat:@"LPA:1$%@$%@$1", address, activationCode];

2. 完善错误解析逻辑

当前代码仅返回结果数值,无法定位具体失败原因,建议在回调中添加错误类型解析:

[plan addPlanWith:request completionHandler:^(CTCellularPlanProvisioningAddPlanResult result) {
    NSString *resultMsg;
    switch (result) {
        case CTCellularPlanProvisioningAddPlanResultUnknown:
            resultMsg = @"未知错误";
            break;
        case CTCellularPlanProvisioningAddPlanResultSuccess:
            resultMsg = @"激活成功";
            break;
        case CTCellularPlanProvisioningAddPlanResultDenied:
            resultMsg = @"用户拒绝授权";
            break;
        case CTCellularPlanProvisioningAddPlanResultFailed:
            resultMsg = @"激活流程失败";
            break;
        case CTCellularPlanProvisioningAddPlanResultNotSupported:
            resultMsg = @"设备不支持eSIM";
            break;
        default:
            resultMsg = @"未定义结果";
    }
    if (result == CTCellularPlanProvisioningAddPlanResultSuccess) {
        resolve(resultMsg);
    } else {
        NSError *error = [NSError errorWithDomain:@"react.native.esim.native.module" code:result userInfo:@{NSLocalizedDescriptionKey: resultMsg}];
        reject(@"activation_failed", resultMsg, error);
    }
    [[UIApplication sharedApplication] endBackgroundTask:backgroundTaskIdentifier];
}];

3. 补充设备与权限检查

  • 确认测试设备为iPhone XS及以后机型,且iOS版本≥12.0(eSIM最低支持版本);
  • 在Info.plist中添加NSCellularNetworkUsageDescription字段,说明App使用蜂窝数据的原因,避免权限缺失导致流程中断。

三、Truphone后端配置核对

  • SMDP地址准确性:确认使用的SMDP地址为Truphone对应环境(测试/生产)的官方地址,不同环境地址可能存在差异;
  • 激活码有效性:检查激活码是否未过期、未被使用,Truphone激活码通常有有效期限制;
  • 前置流程完整性:确认已完成Truphone API的前置认证、订单创建等流程,确保激活码和SMDP地址是通过合法渠道获取的有效数据。

四、额外调试手段

  • 查看系统日志:通过Xcode控制台搜索CoreTelephony或CTCellularPlanProvisioning关键词,系统会输出更详细的错误细节(如SMDP连接失败、激活码无效等);
  • Native Demo验证:使用Apple官方的CoreTelephony eSIM示例代码在纯Native项目中测试,若Native项目可正常激活,说明问题出在React Native模块封装或配置;若Native项目也失败,需排查后端或设备/系统问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 11:37:56