Search code examples
c#windowslibimobiledevice

Get UDID of iphone on Connect c#


I am trying to get Iphone's UDID on connect on a c# application. I've found that I could do that using IMobileDevice-net nuget package, But I could not find further documentation on how to use its classes.

Does anyone know where I can find documentation or have sample code?


Solution

  • I'm now trying to implement the code above on Connect and I am using LibUsbDotnet DeviceNotify library for On connect events, but the issue now is the imobiledevice only returns info when I have two devices connected, it returns blank if only one device connected. On two device connected it shows the device #1 information.

    here is my code

    using iMobileDevice;
    using iMobileDevice.iDevice;
    using iMobileDevice.Lockdown;
    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Collections.Specialized;
    using System.Linq;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading.Tasks;
    using LibUsbDotNet.DeviceNotify;
    using System.Windows.Forms;
    
    namespace MobileDeviceDemo
    {
        class Program
        {
            public static IDeviceNotifier UsbDeviceNotifier = DeviceNotifier.OpenDeviceNotifier();
            static void Main(string[] args)
            {
    
                //// Hook the device notifier event
                UsbDeviceNotifier.OnDeviceNotify += OnDeviceNotifyEvent;
    
                ////NativeLibraries.Load();
    
    
    
                // Exit on and key pressed.
                Console.Clear();
                Console.WriteLine();
                Console.WriteLine("Waiting for USB Devices connection");
                Console.Write("[Press any key to exit]");
    
                while (!Console.KeyAvailable)
                    Application.DoEvents();
    
                UsbDeviceNotifier.Enabled = false;  // Disable the device notifier
    
                // Unhook the device notifier event
                UsbDeviceNotifier.OnDeviceNotify -= OnDeviceNotifyEvent;
                //GenerateUDIDs();
                //Console.ReadLine();
    
    
            }
    
            private static void OnDeviceNotifyEvent(object sender, DeviceNotifyEventArgs e)
            {
                if (e.EventType.ToString() == "DeviceArrival")
                {
                    Console.WriteLine("\n Device Connected");
    
                    GenerateUDIDs();
                }
    
            }
    
            private static void GenerateUDIDs()
            {
                NativeLibraries.Load();
    
                ReadOnlyCollection<string> udids;
                int count = 0;
    
                var idevice = LibiMobileDevice.Instance.iDevice;
                var lockdown = LibiMobileDevice.Instance.Lockdown;
    
                var ret = idevice.idevice_get_device_list(out udids, ref count);
    
                if (ret == iDeviceError.NoDevice)
                {
                    // Not actually an error in our case
                    Console.WriteLine("No devices found");
                    return;
                }
    
                ret.ThrowOnError();
    
                int NumberOfDeviceConnected = udids.Count;
                Console.WriteLine($"\n Number of Devices Connected: {NumberOfDeviceConnected}");
    
                int ctr = 0;
                // Get the device name
                foreach (var udid in udids)
                {
                    ctr++;
                    iDeviceHandle deviceHandle;
                    idevice.idevice_new(out deviceHandle, udid).ThrowOnError();
    
                    LockdownClientHandle lockdownHandle;
                    lockdown.lockdownd_client_new_with_handshake(deviceHandle, out lockdownHandle, "Quamotion").ThrowOnError();
    
                    string deviceName;
                    lockdown.lockdownd_get_device_name(lockdownHandle, out deviceName).ThrowOnError();
    
                    string sn;
                    iMobileDevice.Plist.PlistHandle tested1;
                    lockdown.lockdownd_get_value(lockdownHandle, null, "SerialNumber", out tested1).ThrowOnError();
    
                    //Get string values from plist
                    tested1.Api.Plist.plist_get_string_val(tested1, out sn);
    
    
                    Console.WriteLine($"\n device: {ctr} Name: {deviceName}  UDID: {udid}  Serial Number: {sn}");
    
                    deviceHandle.Dispose();
                    lockdownHandle.Dispose();
                }
            }
        }
    }
    

    and the output is:

    Waiting for USB Devices connection
    [Press any key to exit]
     Device Connected
    
     Number of Devices Connected: 0  
    
       <!--- 1 Device Connected Not Displaying Output --->
    
     Device Connected
    
     Number of Devices Connected: 1
    
       <!--- 2 Device Connected Displaying Only the 1st device connected --->
    
     device: 1 Name: iPhone  UDID: 00008030-001538121A8A802E  Serial Number: F2LZR12AN70F
    
     Device Connected
    
     Number of Devices Connected: 2
    
       <!--- 3 Device Connected Displaying Only the 1st and 2nd device connected --->
    
     device: 1 Name: iPhone  UDID: 8fe1ee498514e1d98a8539c0f414ca5f611a8ea7  Serial Number: F4GY2NZRJC67
    
     device: 2 Name: iPhone  UDID: 00008030-001538121A8A802E  Serial Number: F2LZR12AN70F
    

    Apparently iMobileDevice Code is not triggering response on the first connect, Any Help on this would greatly be appreciated