نسخ احتياطي عبر USB والقرص المحمول
USB خلفية من الدرجة الأولى، وليس مفتاح مستخدم متقدم. provider المحرك هو usb. سطح المكتب وiOS افتراضيًا وضع path. يجب أن يستخدم Android bridge لأن OTG يمنحك فقط URI من نوع content://؛ وopen() في POSIX لا يعمل.
ما يفعله iPhone فعليًا
لن يسرد iOS المجلدات المُركَّبة (FileManager.mountedVolumeURLs فارغ خارج macOS). لا يظهر التطبيق أبدًا «اكتُشف SanDisk». المسار هو:
- وصّل القرص حتى يظهر في الملفات.
- Azalea ← تخزين النسخ ← ملف USB جديد.
- اختر مجلدًا. يخزّن التطبيق علامة security-scoped، وليس سلسلة مسار خام.
- كل استدعاء لاحق للمحرك يعمل داخل
withAccess. استخدام العلامة خارج ذلك النطاق يتحول إلى خطأ إذن Rust مبهم.
في 21 فبراير 2026، iPhone 15 + SanDisk Extreme 1 تيرابايت: بعد الاختيار الأول، جعل قفل الهاتف الإطلاق التالي يبلغ عن غياب المجلد حتى تحديث يدوي. ذلك ليس حشو نسخ — iOS بلا إشعار توصيل يمكن الاشتراك فيه.
لماذا Android هو SAF
OpenDocumentTree، ثم takePersistableUriPermission. تخطَّ استدعاء التثبيت فيموت المنح عند إعادة التشغيل. لا يمشي SafFileBridge عبر DocumentFile.findFile (O(n) لكل مستوى؛ عشرات الآلاف من الصور تتوقف). يفضّل بناء معرّف المستند.
اسحب الكابل فتحصل على DeviceDetached، وليس فشل I/O عام. امتلاء القرص هو OutOfSpace. يجب أن توقف الواجهة، لا أن تلوّن عنصرًا واحدًا بالأحمر وتواصل المسح.
ما يهبط على القرص
<root>/.album/manifest.jsonl للإلحاق فقط. ترويسة الإصدار في السطر الأول، ثم المفتاح المنطقي والمسار المادي والبايتات وMD5 والحذف. يطالب هاتف ثانٍ بنفس المجلد بقراءة ذلك السجل وعكس الأسماء المهرَّبة. لا يظهر .album/ أبدًا في list.
ليس لـ exFAT خاصية xattr. تخزين MD5 كما تفعل خلفيات السحابة سيرمي ENOTSUP في كل رفع USB. تعيش المجاميع الاختبارية في البيان بدلًا من ذلك.
أمور لن تحدث
- لا
presign_put. - لا تنسّق APFS وتتوقع أن يكتب Android عليه.
- قرصان كلاهما باسم Backup يُميَّزان بـ UUID من
volumeIdentity()، وليس تسمية المجلد.