libimobiledevice vs. libimobiledevice-glue: Which Tools to Use and When

Overview

Automating iOS device management with libimobiledevice uses its command-line tools (and library/API) to script tasks like pairing, querying device info, installing/uninstalling apps, backups/restores, screenshots, syslog capture, and mounting images.

Common CLI tools & typical automation commands

Tool Purpose Example
idevicepair Pair/unpair host with device idevicepair pair
idevice_id List connected devices ideviceid -l
ideviceinfo Query device info ideviceinfo -k ProductVersion
ideviceinstaller Install/uninstall/list apps ideviceinstaller install MyApp.ipa
idevicebackup2 Backup/restore device idevicebackup2 backup /path/to/backup
idevicesyslog Stream device syslog idevicesyslog > device.log
idevicescreenshot Capture screen idevicescreenshot screen.png
ideviceimagemounter Mount developer disk images ideviceimagemounter DeveloperDiskImage.dmg

Example automation scripts

1) Basic shell script: install app, take screenshot, collect syslog

bash

#!/bin/bash set -e UDID=\((</span><span class="token" style="color: rgb(54, 172, 170);">idevice_id -l </span><span class="token" style="color: rgb(57, 58, 52);">|</span><span class="token" style="color: rgb(54, 172, 170);"> </span><span class="token" style="color: rgb(57, 58, 52);">head</span><span class="token" style="color: rgb(54, 172, 170);"> -n1</span><span class="token" style="color: rgb(54, 172, 170);">)</span><span> </span>idevicepair pair <span>ideviceinstaller -u </span><span class="token" style="color: rgb(54, 172, 170);">\)UDID install myapp.ipa sleep 2 idevicescreenshot -u \(UDID</span><span> screenshot.png </span><span>idevicesyslog -u </span><span class="token" style="color: rgb(54, 172, 170);">\)UDID > syslog.txt & SYSLOG_PID=\(!</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">sleep</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">10</span><span> </span><span></span><span class="token" style="color: rgb(57, 58, 52);">kill</span><span> </span><span class="token" style="color: rgb(54, 172, 170);">\)SYSLOGPID

2) Backup and verify (bash)

bash

#!/bin/bash set -e BACKUPDIR=”/backups/$(date +%F%T) mkdir -p \(BACKUP_DIR</span><span class="token" style="color: rgb(163, 21, 21);">"</span><span> </span><span></span><span class="token assign-left" style="color: rgb(54, 172, 170);">UDID</span><span class="token" style="color: rgb(57, 58, 52);">=</span><span class="token" style="color: rgb(54, 172, 170);">\)(idevice_id -l | head -n1) idevicepair pair idevicebackup2 -u \(UDID</span><span> backup </span><span class="token" style="color: rgb(163, 21, 21);">"</span><span class="token" style="color: rgb(54, 172, 170);">\)BACKUPDIR idevicebackup2 -u $UDID info

3) Python automation using subprocess (example)

python

import subprocess def run(cmd): return subprocess.check_output(cmd, shell=True).decode().strip() udid = run(“idevice_id -l”).splitlines()[0] subprocess.run(f”idevicepair pair”, shell=True, check=True) print(run(f”ideviceinfo -u {udid} -k ProductVersion”)) subprocess.run(f”ideviceinstaller -u {udid} install app.ipa”, shell=True, check=True)

Best practices

  • Pair once per host (idevicepair) and check pairing before operations.
  • Use UDID (-u) to target a specific device when multiple are connected.
  • Run long-running collectors (syslog) in background and rotate logs.
  • Check tool exit codes and parse JSON/plist output where available.
  • Keep libimobiledevice and usbmuxd updated; some features depend on iOS versions and developer disk images.

Troubleshooting tips

  • If device not found: ensure usbmuxd running and USB cable/trust prompt handled.
  • Pairing errors: remove pairing records (idevicepair unpair) and retry.
  • App install failures: check provisioning/profile compatibility for developer builds; use ideviceinstaller –debug for details.

If you want, I can produce a ready-to-run CI job (GitHub Actions or GitLab CI) that automates installs, backups, and logs.

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *