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

91 lines
3.3 KiB
Markdown

# isideload
A Rust library for sideloading iOS applications. Designed for use in [YCode](https://github.com/nab138/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`:
```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:
```rs
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](examples/minimal/src/main.rs).
## Licensing
This project is licensed under the MPL-2.0 License. See the [LICENSE](LICENSE) file for details.
## Credits
- The amazing [idevice](https://github.com/jkcoxson/idevice) crate is used to communicate with the device
- Packages from [`apple-private-apis`](https://github.com/SideStore/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](https://github.com/zhlynn/zsign) was used for code signing with [custom rust bindings](https://github.com/nab138/zsign-rust)
- [Sideloader](https://github.com/Dadoum/Sideloader) was used as a reference for how the private API endpoints work