uni-app 在 2026 年真机环境下无法稳定跨平台获取 sim 卡信息:ios 彻底禁用相关 api,android 10+ 系统级屏蔽敏感字段,返回空或占位符;唯一可行路径是通过一键登录网关(univerifymanager)在用户授权后由运营商响应附带 operator 字段,手机号须由服务端用 access_token 向运营商接口置换。

在 2026 年的真机环境下,uni-app 无法稳定、跨平台地获取 SIM 卡信息(如 IMSI、ICCID、归属运营商名称、手机号等)。iOS 已彻底禁用相关 API;Android 10+ 起系统级屏蔽多数敏感字段,返回值普遍为空、"Unknown" 或静态占位符。所谓“读取 SIM 卡”不是功能缺失,而是平台策略性封禁。
Android 端调 getSimOperatorName() 为什么经常返回空?
这不是代码写错了,是 Android 系统主动拦截:
-
TelephonyManager.getSimOperatorName()在 Android 10+ 默认返回空字符串或"Unknown",即使 manifest 中已声明android.permission.READ_PHONE_STATE - 部分厂商(华为、小米、OPPO)ROM 会进一步替换为固定字符串(如
"China Mobile"),与实际插卡无关 - 模拟器、HBuilderX 自带调试基座、自定义基座均不可信,必须用真实设备测试
- 双卡机型下该方法只返回默认启用卡的信息,无法指定卡槽,且无 fallback 机制
iOS 端根本拿不到任何 SIM 卡字段
从 iOS 12 开始,CTTelephonyNetworkInfo 和 CTCarrier 的关键属性(mobileCountryCode、mobileNetworkCode、carrierName)已被移除或始终返回 undefined:
- 调用
plus.ios.importClass('CTTelephonyNetworkInfo')可能直接报错或静默失败 - 即使配置了
NSContactsUsageDescription或NSMicrophoneUsageDescription,也无法绕过该限制 - 苹果明确将 SIM 卡识别列为隐私高危操作,不提供任何替代 API
想拿到运营商或手机号?唯一可行路径是走一键登录网关
不要尝试从设备层“读”,要从网络层“认证后附带获取”:
- 调用
univerifyManager(非uni.login)发起一键登录,用户授权后,运营商网关会在响应中附带operator字段(如"CMCC"、"CUCC") - 手机号必须由服务端用
access_token向运营商接口置换,前端永远收不到明文号码 - 该方式依赖数据流量开启、SIM 卡有效(非停机/锁网)、且仅支持 App 端(不含 H5/小程序)
- manifest.json 中必须勾选「OAuth(登录授权)」模块,并启用 uniCloud +
uni-cloud-verify扩展
真正容易被忽略的是:很多开发者花几天调试 getLine1Number() 或遍历 SubscriptionManager,却没意识到这些 API 在 2026 年主流机型上已形同虚设。与其对抗系统策略,不如接受“运营商信息只能来自认证上下文”这一事实——它更安全,也更可靠。











