Skip to main content

ios_core/
lib.rs

1//! Unified high-level API for iOS device interaction.
2//!
3//! This crate ties together device discovery, pairing, tunneling, and service access
4//! into a single ergonomic API. It is the recommended entry point for library consumers.
5//!
6//! Key types:
7//! - [`device::IosDevice`] — connected device handle with service access
8//! - [`discovery`] — USB and network device discovery
9//!
10//! Internal transport modules are not part of the public API. Use top-level
11//! re-exports for supported types:
12//!
13//! ```
14//! use ios_core::{pair_new_device, PairedCredentials, PairingTransportError};
15//! use ios_core::{default_pair_record_path, LockdownClient, LockdownError, PairRecord};
16//! use ios_core::{archive_string, NsUrl, XcTestConfiguration, XctCapabilities};
17//! use ios_core::{TunMode, TunnelError, TunnelHandle, TunnelInfo, TunnelManager};
18//! ```
19//!
20//! ```compile_fail
21//! use ios_core::proto::nskeyedarchiver_encode::archive_string;
22//! ```
23//!
24//! ```compile_fail
25//! use ios_core::lockdown::PairRecord;
26//! ```
27//!
28//! ```compile_fail
29//! use ios_core::pairing_transport::UNTRUSTED_SERVICE_NAME;
30//! ```
31//!
32//! ```compile_fail
33//! use ios_core::tunnel::TunMode;
34//! ```
35//!
36//! ```compile_fail
37//! use ios_core::xpc::RsdHandshake;
38//! ```
39
40pub mod credentials;
41pub mod device;
42pub mod discovery;
43pub mod error;
44pub(crate) mod lockdown;
45pub(crate) mod mux;
46#[cfg(all(feature = "tunnel", feature = "mdns"))]
47pub(crate) mod pairing_transport;
48pub(crate) mod proto;
49#[cfg(feature = "tunnel")]
50pub(crate) mod psk_tls;
51pub mod services;
52#[cfg(test)]
53pub(crate) mod test_util;
54pub(crate) mod tunnel;
55pub(crate) mod xpc;
56
57pub use credentials::{PersistedCredentials, RemotePairingRecord};
58#[cfg(feature = "mdns")]
59pub use device::discover_paired_mobdev2_devices;
60pub use device::{
61    connect_direct_usb_tunnel, connect_remote_pairing_tunnel, connect_tcp_lockdown_tunnel,
62    ConnectOptions, ConnectedDevice, InternationalConfiguration, PairedMobdev2Device,
63    ServiceStream,
64};
65#[cfg(feature = "mdns")]
66pub use discovery::{browse_mobdev2, browse_remotepairing, BonjourService, MdnsDevice};
67pub use discovery::{DeviceEvent, DeviceInfo};
68pub use error::CoreError;
69pub use lockdown::{
70    default_pair_record_path, handshake_only_service_tls, recv_lockdown, send_lockdown,
71    start_lockdown_session, start_service, strip_service_tls, wrap_service_tls, GetValueRequest,
72    GetValueResponse, LockdownClient, LockdownError, PairRecord, PairRecordError, QueryTypeRequest,
73    QueryTypeResponse, RemoveValueRequest, ServiceInfo, SetValueRequest, StartServiceRequest,
74    StartServiceResponse, StartSessionRequest, StartSessionResponse, StopSessionRequest,
75    ValueOperationResponse, CORE_DEVICE_PROXY, LOCKDOWN_PORT,
76};
77#[cfg(feature = "supervised-pair")]
78pub use lockdown::{pair_supervised, save_pair_record, FullPairRecord};
79pub use mux::MuxClient;
80#[cfg(all(feature = "tunnel", feature = "mdns"))]
81pub use pairing_transport::{pair_new_device, PairedCredentials, PairingTransportError};
82pub use proto::nskeyedarchiver_encode::{
83    archive_array, archive_bool, archive_data, archive_dict, archive_float, archive_int,
84    archive_nsurl, archive_null, archive_string, archive_uuid, archive_xct_capabilities,
85    archive_xctest_configuration, NsUrl, XcTestConfiguration, XctCapabilities,
86};
87#[cfg(feature = "accessibility_audit")]
88pub use services::accessibility_audit;
89#[cfg(feature = "afc")]
90pub use services::afc;
91#[cfg(feature = "amfi")]
92pub use services::amfi;
93#[cfg(feature = "apps")]
94pub use services::apps;
95#[cfg(feature = "arbitration")]
96pub use services::arbitration;
97#[cfg(feature = "companion")]
98pub use services::companion;
99#[cfg(feature = "crashreport")]
100pub use services::crashreport;
101#[cfg(feature = "debugserver")]
102pub use services::debugserver;
103#[cfg(feature = "deviceinfo")]
104pub use services::deviceinfo;
105#[cfg(feature = "diagnostics")]
106pub use services::diagnostics;
107#[cfg(feature = "dproxy")]
108pub use services::dproxy;
109#[cfg(feature = "dtx")]
110pub use services::dtx;
111#[cfg(feature = "fetchsymbols")]
112pub use services::fetchsymbols;
113#[cfg(feature = "file_relay")]
114pub use services::file_relay;
115#[cfg(feature = "fileservice")]
116pub use services::fileservice;
117#[cfg(feature = "heartbeat")]
118pub use services::heartbeat;
119#[cfg(feature = "idam")]
120pub use services::idam;
121#[cfg(feature = "imagemounter")]
122pub use services::imagemounter;
123#[cfg(feature = "instruments")]
124pub use services::instruments;
125#[cfg(feature = "mcinstall")]
126pub use services::mcinstall;
127#[cfg(feature = "misagent")]
128pub use services::misagent;
129#[cfg(feature = "mobileactivation")]
130pub use services::mobileactivation;
131#[cfg(feature = "notificationproxy")]
132pub use services::notificationproxy;
133#[cfg(feature = "ostrace")]
134pub use services::ostrace;
135#[cfg(feature = "pcap")]
136pub use services::pcap;
137#[cfg(feature = "power_assertion")]
138pub use services::power_assertion;
139#[cfg(feature = "preboard")]
140pub use services::preboard;
141#[cfg(feature = "prepare")]
142pub use services::prepare;
143#[cfg(feature = "restore")]
144pub use services::restore;
145#[cfg(feature = "screenshot")]
146pub use services::screenshot;
147#[cfg(feature = "springboard")]
148pub use services::springboard;
149#[cfg(feature = "syslog")]
150pub use services::syslog;
151#[cfg(feature = "testmanager")]
152pub use services::testmanager;
153#[cfg(feature = "webinspector")]
154pub use services::webinspector;
155pub use services::{backup2, device_link, simlocation};
156pub use tunnel::{TunMode, TunnelError, TunnelHandle, TunnelInfo, TunnelManager};
157#[cfg(feature = "tunnel")]
158pub use xpc::client::XpcClient;
159pub use xpc::message::flags as xpc_message_flags;
160pub use xpc::message::{
161    decode_message as decode_xpc_message, encode_message as encode_xpc_message, XpcMessage,
162    XpcValue,
163};
164pub use xpc::rsd::{RsdHandshake, ServiceDescriptor, RSD_PORT};
165pub use xpc::XpcError;
166
167/// List all currently connected iOS devices (via usbmuxd).
168pub async fn list_devices() -> Result<Vec<DeviceInfo>, CoreError> {
169    discovery::list_devices().await
170}
171
172/// Watch for usbmux attach/detach events through the reusable ios-core discovery layer.
173pub async fn watch_devices(
174) -> Result<impl futures_core::Stream<Item = Result<DeviceEvent, CoreError>>, CoreError> {
175    discovery::watch_devices().await
176}
177
178/// Connect to an iOS device by UDID and optionally establish a CDTunnel.
179pub async fn connect(udid: &str, opts: ConnectOptions) -> Result<ConnectedDevice, CoreError> {
180    device::connect(udid, opts).await
181}
182
183/// Discover iOS 17+ devices on the local network via mDNS.
184///
185/// Returns a stream of devices with their IPv6 address and RSD port.
186/// Use [`connect`] to establish a session and inspect the RSD service list.
187#[cfg(feature = "mdns")]
188pub async fn discover_mdns() -> Result<impl futures_core::Stream<Item = MdnsDevice>, CoreError> {
189    discovery::discover_mdns().await
190}