# rusty_libimobiledevice Rusty Libimobiledevice - An ergonomic library to communicate with iOS devices. **Tested level: 0.00%** - Contribute to this library by battle testing methods! All functions should be tested for possible segfaults and memory leaks. If you see the `Verified: False`, that means that function needs your help to make sure it's safe. Open a PR with your testing code to change a function's status. ## Building Build and install the following packages: - [libusbmuxd](https://github.com/libimobiledevice/libusbmuxd) - [libimobiledevice](https://github.com/libimobiledevice/libimobiledevice) - [libimobiledevice-glue](https://github.com/libimobiledevice/libimobiledevice-glue) - [openssl](https://github.com/openssl/openssl) **Note:** Package managers do not ship static libraries, so you will need to build them yourself if compiling statically. To cross compile this crate, you can use the ``vendored`` feature and the build script will attempt to clone and build them for the specified target. ## Usage Add the crate and path to your cargo.toml, and add either ``static`` or ``dynamic`` to the features list. This will determine how the library is linked. By default this is dynamic. You can also use the ``vendored`` feature to build libimobiledevice at compile time. Check the [tools](tools) directory for full examples of how to use this library. It has many common use-cases. To list devices detected by a usbmuxd daemon, you can use the following example. ```rust // Include the idevice module. Will be needed in most scenarios. use rusty_libimobiledevice::idevice; fn main() { // Get all devices attatched from the usbmuxd daemon let devices = match idevice::get_devices() { Ok(devices) => devices, Err(e) => { // If the daemon is not running or does not behave as expected, this returns an error println!("Error getting devices: {:?}", e); return; } }; // Devices support the display trait and can be viewed as such println!("Devices found: {:?}", devices); } ``` More complicated code can skip fetching devices from usbmuxd and attach straight to a network device. ## Services This library implements methods for a handful of an iOS device's [services](https://www.theiphonewiki.com/wiki/Services) These can be useful for manipulating functions on the device. For example, you can get a list of apps installed on a device using the following example ```rust use rusty_libimobiledevice::idevice; fn print_apps(udid: String) { // Get the device from usbmuxd using the given UDID let device = match idevice::get_device(udid.to_string()) { Ok(device) => device, Err(e) => { println!("Error: Could not find device: {:?}", e); return; } }; // Start an instproxy service on the device let instproxy_client = match device.new_instproxy_client("idevicelistapps".to_string()) { Ok(instproxy) => { println!("Successfully started instproxy"); instproxy } Err(e) => { println!("Error starting instproxy: {:?}", e); return; } }; // Create a request to be sent using the service let mut client_opts = InstProxyClient::options_new(); InstProxyClient::options_add( &mut client_opts, vec![("ApplicationType".to_string(), Plist::new_string("Any"))], ); InstProxyClient::options_set_return_attributes( &mut client_opts, vec![ "CFBundleIdentifier".to_string(), "CFBundleExecutable".to_string(), "Container".to_string(), ], ); // Send the request and get the lookup results as a plist let lookup_results = match instproxy_client.lookup(vec![], client_opts) { Ok(apps) => { println!("Successfully looked up apps"); apps } Err(e) => { println!("Error looking up apps: {:?}", e); return; } }; println!("{}", lookup_results.to_string()); } ```