Sauvegarde USB et disque portable
USB est un backend de premier rang, pas un interrupteur power-user. Le provider moteur est usb. Desktop et iOS utilisent par défaut le mode path. Android doit utiliser bridge parce que l’OTG ne vous donne qu’une URI content:// ; POSIX open() ne marche pas.
Ce que fait vraiment l’iPhone
iOS ne listera pas les volumes montés (FileManager.mountedVolumeURLs est vide hors macOS). L’app n’affiche jamais « SanDisk détecté ». Le chemin est :
- Branchez le disque jusqu’à ce qu’il apparaisse dans Fichiers.
- Azalea → stockage de sauvegarde → nouveau profil USB.
- Choisissez un dossier. L’app stocke un signet security-scoped, pas une chaîne de chemin brute.
- Chaque appel moteur ultérieur tourne dans
withAccess. Utiliser le signet hors de ce scope devient une erreur de permission Rust opaque.
Le 21 février 2026, iPhone 15 + SanDisk Extreme 1 To : après le premier choix, verrouiller le téléphone a fait signaler le volume manquant au lancement suivant jusqu’à un rafraîchissement manuel. Ce n’est pas du remplissage de copie — iOS n’a pas de notification d’attachement à laquelle s’abonner.
Pourquoi Android est SAF
OpenDocumentTree, puis takePersistableUriPermission. Sautez l’appel de persistance et l’accord meurt au redémarrage. SafFileBridge ne parcourt pas DocumentFile.findFile (O(n) par niveau ; des dizaines de milliers de photos calent). Il préfère construire l’id de document.
Arrachez le câble et vous obtenez DeviceDetached, pas un échec I/O générique. Disque plein est OutOfSpace. L’UI doit se mettre en pause, pas peindre un élément en rouge et continuer à scanner.
Ce qui atterrit sur le disque
<root>/.album/manifest.jsonl est en ajout seulement. En-tête de version à la ligne un, puis object key logique, chemin physique, octets, MD5, tombstones. Un second téléphone revendique le même dossier en lisant ce registre et en inversant les noms échappés. .album/ n’apparaît jamais dans list.
exFAT n’a pas d’xattr. Stocker le MD5 comme le font les backends cloud lèverait ENOTSUP à chaque envoi USB. Les checksums vivent dans le manifeste à la place.
Ce qui n’arrivera pas
- Pas de
presign_put. - Ne formatez pas en APFS en attendant qu’Android y écrive.
- Deux disques s’appelant tous les deux Backup se distinguent par l’UUID
volumeIdentity(), pas l’étiquette de dossier.