.NET MAUI中如何获取iPhone设备型号编号?
在.NET MAUI中可靠获取iPhone型号编号的实现方案
由于.NET MAUI的DeviceInfo仅返回泛化的设备信息(如Model只显示"iPhone"),无法满足精确型号识别需求,我们可以通过平台特定代码调用iOS原生API获取硬件标识符,再映射到你需要的型号编号。
实现步骤
1. 共享项目定义接口
首先在共享项目中定义统一的接口,用于跨平台调用:
public interface IIphoneDeviceInfo { // 获取硬件标识符(如iPhone11,2) string GetHardwareModel(); // 获取映射后的型号编号(如10对应iPhone XS) int? GetModelNumber(); // 判断型号编号是否大于指定值 bool IsModelNoHigherThan(int modelNo); }
2. iOS平台实现接口
在iOS项目中编写接口的具体实现,通过sysctlbyname获取硬件型号,再通过字典完成映射:
首先添加C函数导入
using System; using System.Collections.Generic; using System.Runtime.InteropServices; using ObjCRuntime; namespace YourAppNamespace.iOS.Services { public class IphoneDeviceInfo : IIphoneDeviceInfo { // 导入iOS原生sysctlbyname函数 [DllImport("/usr/lib/libSystem.dylib")] private static extern int sysctlbyname([MarshalAs(UnmanagedType.LPStr)] string property, IntPtr output, ref nuint outputSize, IntPtr input, nuint inputSize);
硬件型号到目标编号的映射字典
根据你提供的对应关系,结合实际硬件标识符完成映射:
private static readonly Dictionary<string, int> _modelMapping = new Dictionary<string, int> { // iPhone 4系列 {"iPhone3,1", 4}, {"iPhone3,2", 4}, {"iPhone3,3", 4}, {"iPhone4,1", 4}, // iPhone 5系列 {"iPhone5,1", 5}, {"iPhone5,2", 5}, {"iPhone5,3", 5}, {"iPhone5,4", 5}, {"iPhone6,1", 5}, {"iPhone6,2", 5}, // iPhone 6系列 {"iPhone7,1", 6}, {"iPhone7,2", 6}, {"iPhone8,1", 6}, {"iPhone8,2", 6}, {"iPhone8,4", 6}, // iPhone 7系列 {"iPhone9,1", 7}, {"iPhone9,3", 7}, {"iPhone9,2", 7}, {"iPhone9,4", 7}, // iPhone 8系列 {"iPhone10,1", 8}, {"iPhone10,4", 8}, {"iPhone10,2", 8}, {"iPhone10,5", 8}, // iPhone X系列 {"iPhone10,3", 10}, {"iPhone10,6", 10}, {"iPhone11,2", 10}, {"iPhone11,4", 10}, {"iPhone11,6", 10}, {"iPhone11,8", 10}, // iPhone 11系列 {"iPhone12,1", 11}, {"iPhone12,3", 11}, {"iPhone12,5", 11}, {"iPhone12,8", 11}, // iPhone 12系列 {"iPhone13,1", 12}, {"iPhone13,2", 12}, {"iPhone13,3", 12}, {"iPhone13,4", 12}, // iPhone 13系列 {"iPhone14,1", 13}, {"iPhone14,2", 13}, {"iPhone14,3", 13}, {"iPhone14,4", 13}, {"iPhone14,5", 13}, // iPhone 14系列 {"iPhone14,6", 14}, {"iPhone14,7", 14}, {"iPhone15,2", 14}, {"iPhone15,3", 14}, // iPhone 15系列 {"iPhone15,4", 15}, {"iPhone15,5", 15}, {"iPhone16,1", 15}, {"iPhone16,2", 15}, // iPhone 16系列 {"iPhone17,1", 16}, {"iPhone17,2", 16}, {"iPhone17,3", 16}, {"iPhone17,4", 16}, {"iPhone17,5", 16} };
实现接口方法
public string GetHardwareModel() { var model = string.Empty; var size = (nuint)sizeof(int); // 获取硬件型号的内存大小 if (sysctlbyname("hw.machine", IntPtr.Zero, ref size, IntPtr.Zero, 0) == 0) { var ptr = Marshal.AllocHGlobal((int)size); // 读取硬件型号 sysctlbyname("hw.machine", ptr, ref size, IntPtr.Zero, 0); model = NSString.FromHandle(ptr).ToString(); Marshal.FreeHGlobal(ptr); } return model; } public int? GetModelNumber() { var hardwareModel = GetHardwareModel(); return _modelMapping.TryGetValue(hardwareModel, out int number) ? number : null; } public bool IsModelNoHigherThan(int modelNo) { var number = GetModelNumber(); return number.HasValue && number.Value > modelNo; } } }
3. 注册依赖注入
在MauiProgram.cs中注册服务,让共享代码可以通过依赖注入获取实现:
using YourAppNamespace.iOS.Services; builder.Services.AddSingleton<IIphoneDeviceInfo, IphoneDeviceInfo>();
4. 在共享代码中使用
通过构造函数注入接口实例,即可调用相关方法:
public class MainViewModel { private readonly IIphoneDeviceInfo _iphoneDeviceInfo; public MainViewModel(IIphoneDeviceInfo iphoneDeviceInfo) { _iphoneDeviceInfo = iphoneDeviceInfo; } public void CheckDevice() { // 判断型号是否大于10 bool isHigherThan10 = _iphoneDeviceInfo.IsModelNoHigherThan(10); // 获取映射后的型号编号 int? modelNumber = _iphoneDeviceInfo.GetModelNumber(); // 获取原始硬件标识符 string hardwareModel = _iphoneDeviceInfo.GetHardwareModel(); } }
注意事项
- 当苹果发布新iPhone型号时,需要更新
_modelMapping字典,添加对应的硬件标识符(可通过官方文档或第三方硬件型号汇总获取)。 - 该方案仅针对iOS平台,在Android等其他平台可返回默认值或做适配处理。
内容的提问来源于stack exchange,提问作者CrazyEight
相关产品推荐
相关产品推荐

