# idevice
A Rust library for interacting with iOS services.
Inspired by [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice)
and [pymobiledevice3](https://github.com/doronz88/pymobiledevice3),
this library interfaces with lockdownd and usbmuxd to perform actions
on an iOS device that a Mac normally would.
For help and information, join the [idevice Discord](https://discord.gg/qtgv6QtYbV)
## State
**IMPORTANT**: Breaking changes will happen at each point release until 0.2.0.
Pin your `Cargo.toml` to a specific version to avoid breakage.
This library is in development and research stage.
Releases are being published to crates.io for use in other projects,
but the API and feature-set are far from final or even planned.
## Features
To keep dependency bloat and compile time down, everything is contained in features.
- afc - Apple File Conduit, partial/in-progress support
- core_device_proxy - Start a secure tunnel to access protected services
- debug_proxy - Send GDB commands
- dvt - Developer tools/instruments
- heartbeat - Heartbeat the device
- installation_proxy - Install/manage apps, partial support
- springboardservices - Manage the sprinboard, partial support
- misagent - Manage provisioning profiles
- mobile_image_mounter - Manage the DDI mounted on the device
- location_simulation - Simulate the GPS location
- tcp - Connect to devices over TCP
- tunnel_tcp_stack - Naive software TCP stack for core_device_proxy
- tss - Requests to Apple's TSS servers, partial support
- tunneld - Interface with pymobiledevice3's tunneld
- usbmuxd - Connect to devices over usbmuxd daemon
- xpc - Get protected services over RSD via XPC
- full (all features)
### Planned/TODO
Finish the following:
- lockdown support
- springboard
Implement the following:
- amfi
- companion_proxy
- crash_reports
- diagnostics
- house_arrest
- mobilebackup2
- notification_proxy
- screenshot
- syslog_relay
- webinspector
As this project is done in my free time within my busy schedule, there
is no ETA for any of these. Feel free to contribute or donate!
## Usage
idevice is purposefully verbose to allow for powerful configurations.
No size fits all, but effort is made to reduce boilerplate via providers.
```rust
// enable the usbmuxd feature
use idevice::{lockdown::LockdowndClient, IdeviceService};
use idevice::usbmuxd::{UsbmuxdAddr, UsbmuxdConnection},
#[tokio::main]
async fn main() {
// usbmuxd is Apple's daemon for connecting to devices over USB.
// We'll ask usbmuxd for a device
let mut usbmuxd = UsbmuxdConnection::default()
.await
.expect("Unable to connect to usbmxud")
let devs = usbmuxd.get_devices().unwrap();
if devs.is_empty() {
eprintln!("No devices connected!");
return;
}
// Create a provider to automatically create connections to the device.
// Many services require opening multiple connections to get where you want.
let provider = devs[0].to_provider(UsbmuxdAddr::from_env_var().unwrap(), 0, "example-program")
// ``connect`` takes an object with the provider trait
let mut lockdown_client = match LockdowndClient::connect(&provider).await {
Ok(l) => l,
Err(e) => {
eprintln!("Unable to connect to lockdown: {e:?}");
return;
}
};
println!("{:?}", lockdown_client.get_value("ProductVersion").await);
println!(
"{:?}",
lockdown_client
.start_session(
&provider
.get_pairing_file()
.await
.expect("failed to get pairing file")
)
.await
);
println!("{:?}", lockdown_client.idevice.get_type().await.unwrap());
println!("{:#?}", lockdown_client.get_all_values().await);
}
```
More examples are in the ``tools`` crate and in the crate documentation.
## FFI
For use in other languages, a small FFI crate has been created to start exposing
idevice. Example C programs can be found in this repository.
## Version Policy
As Apple prohibits downgrading to older versions, this library will
not keep compatibility for older versions than the current stable release.
## Developer Disk Images
doronz88 is kind enough to maintain a [repo](https://github.com/doronz88/DeveloperDiskImage)
for disk images and personalized images.
On MacOS, you can find them at ``~/Library/Developer/DeveloperDiskImages``.
## License
MIT