簡體   English   中英

如何使用 C# 從 IOS 設備獲取 IMEI

[英]How to get IMEI from IOS device using C#

我需要使用 C# 讀取 IOS 設備的 IMEI ...

這在 C#/Xamarin 中是否可行? 還是有另一個值可以用來識別設備?

一些設備標識符現在無法從 iOS 的公共 API 中獲取:

IMSI - 國際移動用戶識別碼(SIM 卡號)

IMEI - 國際移動設備識別碼(設備 ID)

UDID - Apple iDevices 的唯一設備標識符

MAC 地址 - 媒體訪問控制地址(網絡地址)

看看這里: http : //studyswift.blogspot.gr/2015/12/asidentifiermanager-get-idfv-vendor.html

如果您可以使用任何提供的 ID,代碼在 Swift 中,但如果您使用 C#/Xamarin,則轉換起來並不困難。

希望這有幫助

我也試圖找到一種方法來捕獲 IMEI,但我相信這是不可能的。 我解決它的唯一方法是使用此代碼,它返回序列號

 public class IosDevice 
 {
        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern uint IOServiceGetMatchingService(uint masterPort, IntPtr matching);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern IntPtr IOServiceMatching(string s);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern IntPtr IORegistryEntryCreateCFProperty(uint entry, IntPtr key, IntPtr allocator, uint options);

        [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
        private static extern int IOObjectRelease(uint o);

        public string GetIdentifier()
        {
            string serial = string.Empty;
            uint platformExpert = IOServiceGetMatchingService(0, IOServiceMatching("IOPlatformExpertDevice"));

            if (platformExpert != 0)
            {
                NSString key = (NSString)"IOPlatformSerialNumber";
                IntPtr serialNumber = IORegistryEntryCreateCFProperty(platformExpert, key.Handle, IntPtr.Zero, 0);

                if (serialNumber != IntPtr.Zero)
                {
                    serial = NSString.FromHandle(serialNumber);
                }

                IOObjectRelease(platformExpert);
            }

            return serial;
        }
    }

如果有人想在 MacOS 中獲得 USB 設備的 vid、pid

public class OsxDeviceDiscovery
{
    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern int IOServiceGetMatchingService(int masterPort, IntPtr matching);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern int IOServiceGetMatchingServices(int masterPort, IntPtr matching, out IntPtr iterator);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern IntPtr IOServiceMatching(string name);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern IntPtr IORegistryEntryCreateCFProperty(int entry, IntPtr key, IntPtr allocator, uint options);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern int IOObjectRelease(int o);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern int IOIteratorNext(IntPtr iterator);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern bool CFNumberGetValue(IntPtr number,long type, ref long value);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern int CFNumberGetType(IntPtr number);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern bool CFStringGetCString(IntPtr stringRef, byte[] str, int size, int encoding);

    [DllImport("/System/Library/Frameworks/IOKit.framework/IOKit")]
    private static extern int IORegisterEntryCreateIterator(IntPtr entry, IntPtr plane, int options, out IntPtr iterator);

    public static string GetIdentifier()
    {
        string deviceName = string.Empty;
        IntPtr matchingNodes;
        int platformExpert = IOServiceGetMatchingServices(0, IOServiceMatching("IOUSBDevice"), out matchingNodes);

        int node = -1;
        while ((node = IOIteratorNext(matchingNodes)) != 0)
        {
            long vendorID = 0;
            long productID = 0;
            long locationId = 0;

            NSString key = (NSString)"idVendor";
            IntPtr proRef = IORegistryEntryCreateCFProperty(node, key.Handle, IntPtr.Zero, 0);
            if (proRef != IntPtr.Zero)
            {
                long type = CFNumberGetType(proRef);
                CFNumberGetValue(proRef, type, ref vendorID);
            }

            key = (NSString)"idProduct";
            proRef = IORegistryEntryCreateCFProperty(node, key.Handle, IntPtr.Zero, 0);
            if (proRef != IntPtr.Zero)
            {
                long type = CFNumberGetType(proRef);
                CFNumberGetValue(proRef, type, ref productID);
            }

            if (vendorID != 0x1234 || productID != 0x5678)
            {
                IOObjectRelease(node);
                continue;
            }

            key = (NSString)"locationID";
            proRef = IORegistryEntryCreateCFProperty(node, key.Handle, IntPtr.Zero, 0);
            if (proRef != IntPtr.Zero)
            {
                long type = CFNumberGetType(proRef);
                CFNumberGetValue(proRef, type, ref locationId);
            }

            key = (NSString)"kUSBSerialNumberString";
            proRef = IORegistryEntryCreateCFProperty(node, key.Handle, IntPtr.Zero, 0);
            if (proRef != IntPtr.Zero)
            {
                byte[] byteArray = new byte[20];
                CFStringGetCString(proRef, byteArray, 20, 0x0600);
                string serialNumber = System.Text.Encoding.UTF8.GetString(byteArray);
                deviceName = "/dev/cu.usbmodem" + serialNumber;
            }


            IOObjectRelease(node);
        }

        return deviceName;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM