artehe / Netimobiledevice

A C#/dotnet implementation for working with iOS devices (iPhone, iPad, iPod).
https://github.com/artehe/Netimobiledevice
MIT License
14 stars 7 forks source link
csharp csharp-library dotnet dotnetcore ios ipad iphone ipod library lockdownd usbmux usbmuxd

Netimobiledevice

Netimobiledevice is a pure C# implementation for working with iOS devices (iPhone, iPad, iPod).

Features

Installation

To install Netimobiledevice, you can use the following command in the Package Manager Console:

Install-Package Netimobiledevice

Alternatively, you can use the .NET CLI:

dotnet add package Netimobiledevice

Usage

A few examples of how to use Netimobiledevice are below.

Get a list of all currently connected devices using:

using Netimobiledevice.Usbmuxd;

List<UsbmuxdDevice> devices = Usbmux.GetDeviceList();
Console.WriteLine($"There's {devices.Count} devices connected");
foreach (UsbmuxdDevice device in devices) {
    Console.WriteLine($"Device found: {device.DeviceId} - {device.Serial}");
}

Listen to connection events:

Usbmux.Subscribe(SubscriptionCallback);

private static void SubscriptionCallback(UsbmuxdDevice device, UsbmuxdConnectionEventType connectionEvent)
{
    Console.WriteLine("NewCallbackExecuted");
    Console.WriteLine($"Connection event: {connectionEvent}");
    Console.WriteLine($"Device: {device.DeviceId} - {device.Serial}");
}

Get the app icon displayed on the home screen as a PNG:

using (UsbmuxLockdownClient lockdown = MobileDevice.CreateUsingUsbmux("60653a518d33eb53b3ca2322de3f44e162a42069"))
{
    SpringBoardServicesService springBoard = new SpringBoardServicesService(lockdown);
    PropertyNode png = springBoard.GetIconPNGData("net.whatsapp.WhatsApp");
}

Create an iTunes backup:

using (UsbmuxLockdownClient lockdown = MobileDevice.CreateUsingUsbmux("60653a518d33eb53b3ca2322de3f44e162a42069")) {
    using (DeviceBackup backupJob = new DeviceBackup(lockdown, @"C:\Users\User\Downloads")) {
        backupJob.BeforeReceivingFile += BackupJob_BeforeReceivingFile;
        backupJob.Completed += BackupJob_Completed;
        backupJob.Error += BackupJob_Error;
        backupJob.FileReceived += BackupJob_FileReceived;
        backupJob.FileReceiving += BackupJob_FileReceiving;
        backupJob.FileTransferError += BackupJob_FileTransferError;
        backupJob.PasscodeRequiredForBackup += BackupJob_PasscodeRequiredForBackup;
        backupJob.Progress += BackupJob_Progress;
        backupJob.Status += BackupJob_Status;
        backupJob.Started += BackupJob_Started;

        await backupJob.Start();
    }
}

Pair an iOS device asyncronously:

using (UsbmuxLockdownClient lockdown = MobileDevice.CreateUsingUsbmux(testDevice?.Serial ?? string.Empty)) {
    Progress<PairingState> progress = new();
    progress.ProgressChanged += Progress_ProgressChanged;
    await lockdown.PairAsync(progress);
}

private void Progress_ProgressChanged(object? sender, PairingState e)
{
    Console.WriteLine($"Pair Progress Changed: {e}");
}

Get structured logging information using the logger of your choice (provided it can interact with Microsoft.Extentions.Logging ILogger):

using Microsoft.Extensions.Logging;

using ILoggerFactory factory = LoggerFactory.Create(builder => builder.SetMinimumLevel(LogLevel.Debug).AddConsole());
using (LockdownClient lockdown = MobileDevice.CreateUsingUsbmux(testDevice?.Serial ?? string.Empty, logger: factory.CreateLogger("Netimobiledevice"))) {
    using (DeviceBackup backupJob = new DeviceBackup(lockdown, path)) {
        await backupJob.Start(tokenSource.Token);
    }
}

Services

The list of all the services from lockdownd which have been implemented and the functions available for each one. Clicking on the service name will take you to it's implementation, to learn more about it.

License

This project is licensed under the MIT LICENSE.

Contributing

Contributions are welcome. Please submit a pull request or create an issue to discuss your proposed changes.

Acknowledgments

This library was based on the following repositories with either some refactoring or in the case of libraries such as libusbmuxd translating from C to C#.