基于.NET 6的MAUI应用获取移动运营商名称:MAUI Essentials及原生API可行吗?
检测移动运营商名称的实现方案(.NET MAUI)
一、MAUI Essentials 支持情况
目前MAUI Essentials没有提供直接获取移动运营商名称的跨平台API,需要通过调用iOS/Android的原生API来实现。
二、Android 原生实现方案
1. 权限配置
在Android项目的AndroidManifest.xml中添加权限:
<!-- Android 10及以上版本需要 --> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
注意:Android 6.0及以上版本需要动态申请READ_PHONE_STATE权限,否则会触发权限异常。
2. 代码实现
通过MAUI依赖服务封装原生逻辑:
// 定义跨平台接口 public interface ICarrierService { string GetCarrierName(); } // Android平台实现类 [assembly: Dependency(typeof(AndroidCarrierService))] namespace YourApp.Platforms.Android { public class AndroidCarrierService : ICarrierService { public string GetCarrierName() { var telephonyManager = (TelephonyManager)Android.App.Application.Context.GetSystemService(Context.TelephonyService); // 检查权限是否已授予 if (ContextCompat.CheckSelfPermission(Android.App.Application.Context, Manifest.Permission.ReadPhoneState) != Permission.Granted) { return "权限未授予"; } // 优先获取当前网络运营商名称,无结果则取SIM卡运营商名称 var networkCarrier = telephonyManager.NetworkOperatorName; if (!string.IsNullOrEmpty(networkCarrier)) return networkCarrier; var simCarrier = telephonyManager.SimOperatorName; return string.IsNullOrEmpty(simCarrier) ? "未知运营商" : simCarrier; } } }
MAUI项目中调用示例:
var carrierService = DependencyService.Get<ICarrierService>(); var carrierName = carrierService.GetCarrierName();
三、iOS 原生实现方案(含iOS 16 权限调整)
1. iOS 16 权限变化
iOS 16及以后,苹果对运营商信息获取做了严格限制:
- 必须在
Info.plist中添加NSCellularNetworkUsageDescription键,说明应用获取蜂窝网络信息的用途,否则应用会被拒绝上架。 - 用户需要在系统设置中为应用开启“蜂窝网络”权限,否则
CTCarrier.CarrierName会返回null。 - 仅当应用处于前台且设备连接蜂窝网络时,才能正常获取运营商名称。
2. 权限配置
在iOS项目的Info.plist中添加:
<key>NSCellularNetworkUsageDescription</key> <string>需要获取运营商信息以提供对应服务</string>
3. 代码实现
通过依赖服务封装原生逻辑:
// 跨平台接口同Android部分 [assembly: Dependency(typeof(IOSCarrierService))] namespace YourApp.Platforms.iOS { public class IOSCarrierService : ICarrierService { public string GetCarrierName() { var networkInfo = new CTTelephonyNetworkInfo(); var carriers = networkInfo.ServiceSubscriberCellularProviders; if (carriers == null || carriers.Count == 0) return "未知运营商"; // 双卡设备可遍历所有运营商,此处取第一个可用结果 var carrier = carriers.First().Value; return string.IsNullOrEmpty(carrier.CarrierName) ? "未知运营商" : carrier.CarrierName; } } }
注意:iOS 16及以上版本,若用户未授权权限,carrier.CarrierName会返回空字符串,建议在调用前检查权限状态,引导用户开启权限。
内容的提问来源于stack exchange,提问作者MobileDev
相关产品推荐
相关产品推荐

