能,但仅限Android真机且需plus.android调原生API;iOS因CTTelephonyNetworkInfo被禁用而完全不可行,Android 10+上getSimOperatorName()可能返回空或"Unknown",须真机测试并配置manifest权限。

uni-app里能不能直接读取运营商名称?
能,但仅限 Android 真机,且必须用 plus.android 调原生 API;iOS 完全不可行——从 iOS 12 起,CTTelephonyNetworkInfo 已被禁用,连 MCC/MNC 都拿不到,更别说运营商名。
常见错误现象:TelephonyManager.getSimOperatorName() 在 Android 10+ 返回空字符串或 "Unknown",不是代码写错了,是系统拦截了;模拟器和 HBuilderX 自带调试基座也基本返回假值,必须真机测试。
- 需要在
manifest.json的「Android 配置」里显式声明权限:android.permission.READ_PHONE_STATE - 不需要动态申请该权限(Android 10+ 后它降级为普通权限),但 targetSdkVersion > 28 时,
getLine1Number()会失效,而getSimOperatorName()仍可工作 - 双卡机型下,
getSimOperatorName()返回的是默认启用卡的运营商名,无法指定读哪张卡
Android 端获取运营商名的标准写法
别用 uni.getNetworkType() ——它只返回 "wifi" 或 "cellular",和运营商无关;也别信网上那些遍历 SubscriptionManager 的代码,2026 年主流新机型(尤其华为、小米、OPPO)大概率返回空列表。
最稳的路径就是直调 TelephonyManager.getSimOperatorName(),示例:
if (uni.getSystemInfoSync().platform === 'android') {
const context = plus.android.importClass('android.content.Context')
const TelephonyManager = plus.android.runtimeMainActivity().getSystemService(context.TELEPHONY_SERVICE)
const operatorName = plus.android.invoke(TelephonyManager, 'getSimOperatorName')
console.log('运营商名称:', operatorName || '未知')
}
-
operatorName是字符串,如"China Mobile"、"China Unicom",部分定制 ROM 可能返回中文或乱码 - 如果返回空,优先检查是否插了有效 SIM 卡(非欠费/停机/锁网状态),其次确认 manifest 权限已勾选
- 不要对返回值做精确字符串匹配(比如
=== "China Telecom"),建议用includes()或正则模糊判断
为什么不能靠网络类型反推运营商?
uni.getNetworkType() 和运营商无绑定关系。同一台设备切 WiFi 和蜂窝网,返回值变,但运营商不变;反过来,蜂窝网下即使没插卡,某些安卓机型也会伪造 "cellular" 状态——这跟运营商识别毫无关系。
更危险的是,有人试图用 plus.networkinfo 或 getNetworkType 结合 IP 归属地查运营商,结果发现:IP 地址常走 NAT 池、CDN 中转、或被运营商统一分配,归属地 ≠ 实际接入运营商(比如联通用户可能拿到移动 CDN 的 IP)。
- 真实场景中,用户开热点共享网络,
getNetworkType返回"wifi",但手机本身仍是电信卡 - eSIM 激活后未切换主卡,
getNetworkType显示蜂窝,但getSimOperatorName()仍返回旧卡信息 - 工信部要求所有蜂窝数据必须经由本运营商网关,但 API 层面不暴露该链路细节
App 端还有没有其他靠谱替代方案?
没有。一键登录(univerifyManager)能拿到手机号,但不返回运营商字段;uni.login({provider: 'univerify'}) 已废弃,且旧接口也不提供运营商信息。
如果你真正需要的是“用户当前使用的蜂窝网络归属”,而不是“SIM 卡运营商”,那唯一可行路径是服务端配合:前端传 ip + userAgent + 设备指纹,后端调用运营商 BSS 接口(需持牌资质)或合规第三方(如三大运营商开放平台)做号段比对——但这属于服务端能力,前端只能提供辅助线索。
容易被忽略的一点:Android 12+ 引入了 SubscriptionManager.getCarrierName(),但 uni-app 尚未封装该 API,且需额外声明 READ_PHONE_STATE 和 READ_PRIVILEGED_PHONE_STATE(后者 require system signature),普通应用无法获取。


















