在 Connect c# 上获取 iphone 的 UDID
Get UDID of iphone on Connect c#
我正在尝试获取 Iphone 在 c# 应用程序上连接时的 UDID。我发现我可以使用 IMobileDevice-net nuget 包来做到这一点,但是我找不到关于如何使用其 类.
的更多文档
有人知道我在哪里可以找到文档或示例代码吗?
IMobileDevice-net
文档的 link 似乎已损坏。但您可以在 Documentation of IMobileDevice-net
找到它
根据为 IMobileDevice-net
提供的示例代码,如果设备 Name
已知,则可以找到设备的 UDID
。相同的代码片段是:
ReadOnlyCollection<string> udids;
int count = 0;
var idevice = LibiMobileDevice.Instance.iDevice;
var lockdown = LibiMobileDevice.Instance.Lockdown;
// Get all devices connected
var ret = idevice.idevice_get_device_list(out udids, ref count);
if (ret == iDeviceError.NoDevice)
{
// Not actually an error in our case
return;
}
ret.ThrowOnError();
// Variable to store UDID of
string foundUDID = "";
var nameOfDevice = "NameOfYourDevice";
// Get the device name
foreach (var udid in udids)
{
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();
deviceHandle.Dispose();
lockdownHandle.Dispose();
if(deviceName.equals(nameOfDevice)) //Check if name matches
{
foundUDID = udid;
break;
}
}
我现在正在尝试在 Connect 上实现上面的代码,并且我正在使用 LibUsbDotnet DeviceNotify 库处理 On connect 事件,但现在的问题是当我连接了两个设备时,imobiledevice 仅 returns 信息,如果只连接了一个设备,它 returns 空白。
在连接的两个设备上,它显示设备 #1 信息。
这是我的代码
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();
}
}
}
}
输出为:
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
显然 iMobileDevice 代码不会在第一次连接时触发响应,非常感谢对此的任何帮助
我正在尝试获取 Iphone 在 c# 应用程序上连接时的 UDID。我发现我可以使用 IMobileDevice-net nuget 包来做到这一点,但是我找不到关于如何使用其 类.
的更多文档有人知道我在哪里可以找到文档或示例代码吗?
IMobileDevice-net
文档的 link 似乎已损坏。但您可以在 Documentation of IMobileDevice-net
根据为 IMobileDevice-net
提供的示例代码,如果设备 Name
已知,则可以找到设备的 UDID
。相同的代码片段是:
ReadOnlyCollection<string> udids;
int count = 0;
var idevice = LibiMobileDevice.Instance.iDevice;
var lockdown = LibiMobileDevice.Instance.Lockdown;
// Get all devices connected
var ret = idevice.idevice_get_device_list(out udids, ref count);
if (ret == iDeviceError.NoDevice)
{
// Not actually an error in our case
return;
}
ret.ThrowOnError();
// Variable to store UDID of
string foundUDID = "";
var nameOfDevice = "NameOfYourDevice";
// Get the device name
foreach (var udid in udids)
{
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();
deviceHandle.Dispose();
lockdownHandle.Dispose();
if(deviceName.equals(nameOfDevice)) //Check if name matches
{
foundUDID = udid;
break;
}
}
我现在正在尝试在 Connect 上实现上面的代码,并且我正在使用 LibUsbDotnet DeviceNotify 库处理 On connect 事件,但现在的问题是当我连接了两个设备时,imobiledevice 仅 returns 信息,如果只连接了一个设备,它 returns 空白。 在连接的两个设备上,它显示设备 #1 信息。
这是我的代码
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();
}
}
}
}
输出为:
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
显然 iMobileDevice 代码不会在第一次连接时触发响应,非常感谢对此的任何帮助