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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 20:24:58