Connection
RSD
Discover and connect to Remote Service Discovery services.
RSD discovers services advertised through the RemoteXPC handshake. RsdHandshake
parses the service table and connects typed RsdService clients by advertised
port.
Use It For
- Listing RemoteXPC/RSD services.
- Connecting to clients that implement
RsdService. - Reading advertised service metadata such as port, entitlement, and
UsesRemoteXPC.
Feature Flag
[dependencies]
idevice = { version = "0.1.64", features = ["rsd", "xpc"] }rsd enables xpc in the crate feature graph.
Transport Path
RSD socket -> RemoteXPC handshake -> Services dictionary -> service portOver USB for iOS 17+ service access, the bundled tools create the RSD socket
through CoreDeviceProxy and a software tunnel.
Rust Example
use idevice::rsd::RsdHandshake;
let mut handshake = RsdHandshake::new(rsd_stream).await?;
for (name, service) in &handshake.services {
println!("{name}: port={} xpc={}", service.port, service.uses_remote_xpc);
}Connect a typed RSD service:
let client = handshake
.connect::<YourRsdService>(&mut rsd_provider)
.await?;CLI Equivalent
List RemoteXPC services through the bundled USB tunnel path:
idevice-tools remotexpcRemote pairing and tunnel inspection:
idevice-tools rppairing tunnelCommon Errors
| Error | What to check |
|---|---|
Missing Services dictionary | The stream did not complete the expected RSD handshake. |
ServiceNotFound | The requested RsdService::rsd_service_name() is not advertised. |
| RSD connect failed | The tunnel/provider could not connect to the advertised port. |