Files
isideload/README.md
2025-08-09 22:41:58 -04:00

3.3 KiB

isideload

A Rust library for sideloading iOS applications. Designed for use in YCode.

Disclaimer

This package uses private Apple Developer APIs. Use at your own risk.

Usage

To use isideload, add the following to your Cargo.toml:

[dependencies]
isideload = { version = "0.1.0", features = ["vendored-openssl", "vendored-botan" ] } # Optionally, both vendored features can be enabled to avoid needing OpenSSL and Botan installed on your system.

Then, you can use it like so:

use std::{env, path::PathBuf, sync::Arc};
use isideload::{
    AnisetteConfiguration, AppleAccount, DefaultLogger, DeveloperSession, device::list_devices,
    sideload::sideload_app,
};

#[tokio::main]
async fn main() {
    let args: Vec<String> = env::args().collect();
    let app_path = PathBuf::from(
        args.get(1)
            .expect("Please provide the path to the app to install"),
    );
    let apple_id = args
        .get(2)
        .expect("Please provide the Apple ID to use for installation");
    let apple_password = args.get(3).expect("Please provide the Apple ID password");

    // You don't have to use the builtin list_devices method if you don't want to use usbmuxd
    // You can use idevice to get the device info however you want
    // This is just easier
    let device = list_devices().await.unwrap().into_iter().next().unwrap();
    println!("Target device: {}", device.name);

    // Change the anisette url and such here
    // Note that right now only remote anisette servers are supported
    let anisette_config = AnisetteConfiguration::default();

    let get_2fa_code = || {
        let mut code = String::new();
        println!("Enter 2FA code:");
        std::io::stdin().read_line(&mut code).unwrap();
        Ok(code.trim().to_string())
    };

    let account = AppleAccount::login(
        || Ok((apple_id.to_string(), apple_password.to_string())),
        get_2fa_code,
        anisette_config,
    )
    .await
    .unwrap();

    let dev_session = DeveloperSession::new(Arc::new(account));

    // This is where certificates, mobileprovision, and anisette data will be stored
    let store_dir = std::env::current_dir().unwrap();

    // DefaultLogger just prints to the stdout/stderr, but you can provide your own implementation
    sideload_app(DefaultLogger {}, &dev_session, &device, app_path, store_dir)
        .await
        .unwrap()
}

See examples/minimal/src/main.rs.

Licensing

This project is licensed under the MPL-2.0 License. See the LICENSE file for details.

Credits

  • The amazing idevice crate is used to communicate with the device

  • Packages from apple-private-apis were used for authentication, but the original project was left unfinished. To support isideload, apple-private-apis was forked and modified to add missing features. With permission from the original developers, the fork was published to crates.io until the official project is published.

  • ZSign was used for code signing with custom rust bindings

  • Sideloader was used as a reference for how the private API endpoints work