Файлы, загрузки и передача
Бóльшая часть того, что кажется произвольным в файлах на iPhone, следует из одного правила об изоляции, а бóльшая часть того, что делает загрузки надёжными, следует из одной возможности HTTP. Здесь и то и другое, а также способы, которыми файлы перемещаются с устройства на устройство.
-
Песочница
sandbox -
Правило, по которому каждое приложение видит только собственное хранилище. Именно из-за него одно приложение не может открыть загрузки другого, и именно поэтому «файл лежит рядом с видео» — это то, чего на iOS попросту не существует.
Каждое приложение получает приватный каталог и не видит ничей другой. Файлы переходят между приложениями только через осознанные действия — меню «Поделиться», выбор документа, перетаскивание, — и каждое из них является решением человека, а не тем, что приложение взяло само.
Цена этого проявляется в мелочах. Настольные плееры автоматически находят
film.srtрядом сfilm.mkv; на iOS никакого «рядом» не существует, поэтому файл субтитров приходится передавать намеренно, и именно приложение должно запоминать эту пару.Смотри также: Группа приложенийЗащищённая закладка
-
Группа приложений
app group -
Общий контейнер, который могут открыть два приложения одного разработчика, — единственная санкционированная трещина в песочнице. Именно так расширение «Поделиться» передаёт файл приложению, которому оно принадлежит.
Расширение «Поделиться» — это отдельная программа от того приложения, частью которого она кажется, со своей собственной песочницей и очень короткой жизнью. Оно не может писать в хранилище основного приложения.
Поэтому оно пишет в контейнер, который обоим разрешено видеть, а приложение забирает содержимое этого контейнера при следующем запуске. Ничто не пересекает границу разработчика, и ничто не переходит без явного нажатия пользователя.
Смотри также: Песочница
-
Защищённая закладка
security-scoped bookmark -
Токен, запоминающий разрешение на папку вне песочницы — внешний диск, папку в iCloud, — чтобы приложение могло открыть её позже, не спрашивая заново.
Когда ты выбираешь расположение через системный выбор файлов, выданное разрешение действует только на этот момент. Закладка сохраняет его между запусками, а приложение должно явно начинать и заканчивать использование доступа, который она представляет.
Именно это делает возможным просмотр внешнего SSD-диска без копирования чего-либо внутрь, и область действия ограничена точно тем, что ты выбрал, — закладка на одну папку не даёт никаких прав на соседнюю.
Смотри также: Песочница
-
Range-запрос
range request -
Запрос к серверу на конкретный кусок файла — байты с 5 000 000 по 5 999 999 — вместо файла целиком. Именно это делает загрузку возобновляемой и позволяет нескольким соединениям забирать один файл одновременно.
Сервер, поддерживающий диапазоны, отвечает кодом 206 Partial Content и присылает запрошенный кусок. Тот, что не поддерживает, отвечает кодом 200 и присылает всё с самого начала — в этом и разница между продолжением загрузки и её перезапуском.
Всё интересное в движке загрузок опирается именно на эту одну возможность HTTP. Без неё нет возобновления после обрыва соединения, нет возобновления после перезагрузки и нет способа использовать больше одного соединения.
Смотри также: Возобновляемая загрузкаПараллельные соединения
-
Возобновляемая загрузка
-
Передача, которая продолжается точно с того места, где остановилась, а не начинается заново, — за счёт фиксации количества уже записанных байт и запроса только остальных.
Требование в том, что зафиксированное число никогда не должно быть оптимистичным. Байт, посчитанный как записанный, но всё ещё лежащий в буфере, превращается в дыру в файле, когда приложение принудительно завершается, — а дыра посреди видео проявляется как повреждение только спустя час просмотра.
Именно поэтому счётчик должен следовать за записью на диск, а не за чтением из сети, и именно поэтому при каждой передаче между обычной и фоновой загрузкой обе стороны должны сходиться на одном и том же числе.
Смотри также: Range-запросФоновая передача
-
Параллельные соединения
многопоточная загрузка, загрузка кусками -
Разбиение одного файла на диапазоны и одновременное скачивание нескольких из них. Помогает, когда ограничивается именно одно соединение, и совершенно бесполезно, когда узкое место — твоя собственная линия.
Сервер, ограничивающий скорость каждого отдельного соединения, часто можно убедить в сумме отдать больше через несколько соединений сразу. Именно здесь многопоточная загрузка и заслужила свою репутацию.
Это не магия, и её часто понимают неверно. Если твоё соединение уже загружено полностью, дополнительные соединения просто делят ту же самую пропускную способность на более мелкие куски и добавляют накладные расходы. Некоторые серверы к тому же отклоняют или ограничивают несколько запросов с одного адреса.
Смотри также: Range-запросВозобновляемая загрузка
-
Фоновая передача
-
Загрузка, переданная операционной системе, чтобы она продолжалась после закрытия приложения. Время выполнения решает система — это и есть плата за то, что передача вообще продолжается.
Приложение на iOS прекращает работу вскоре после того, как ты его покидаешь. Передача, отданная фоновой службе системы, переживает это, переживает принудительное завершение приложения и возобновляется после перезагрузки.
От чего приходится отказаться — так это от контроля. Система группирует такие передачи, исходя из собственного представления о заряде батареи и состоянии сети, поэтому фоновая загрузка может ставиться на паузу и возобновляться не так, как это делала бы загрузка внутри приложения, — но она обязательно завершится.
Смотри также: Возобновляемая загрузкаПесочница
-
WebDAV
-
Расширение HTTP, превращающее веб-сервер в файловый сервер: список, чтение, запись, перемещение, удаление. Именно на нём говорят Nextcloud и ownCloud, и именно его предлагает большинство NAS-накопителей.
Поскольку в основе лежит HTTP, WebDAV работает через ту же инфраструктуру, что и всё остальное в вебе, — без специальных портов, без специального клиентского протокола, — именно поэтому он выжил, пока более сложные файловые протоколы не выжили.
Для того, кто не хочет держать файлы в облаке какой-либо компании, это практическая альтернатива: собственный сервер, собственные учётные данные, обычные стандарты.
Смотри также: Облачное хранилище
-
Облачное хранилище
-
Файлы, хранящиеся на чужом сервере и доступные через API этой компании, — Dropbox, OneDrive, Box, pCloud. У каждого свой интерфейс, поэтому приложения добавляют поддержку по одному провайдеру за раз.
Единого облачного протокола не существует. Каждый провайдер спроектировал собственный API и собственный процесс входа, поэтому добавление провайдера в приложение — это реальная работа, а не просто пункт настройки.
Вход обычно происходит через OAuth, а значит приложение никогда не видит пароль: провайдер аутентифицирует человека и выдаёт токен, который можно отозвать в любой момент из настроек самого провайдера.
Смотри также: WebDAV
-
WebRTC
-
Стандарт для прямого соединения двух устройств без сервера между ними после установки связи. Именно его использует передача между устройствами, чтобы перенести файл через комнату.
Небольшой сигнальный сервер знакомит два устройства друг с другом — именно для этого нужен шестизначный код — а затем отходит в сторону. Файл идёт напрямую между устройствами и нигде между ними не сохраняется.
В пределах одной сети скорость ограничена только самой сетью. Через интернет всё зависит от того, могут ли обе стороны быть достигнуты напрямую, — именно поэтому соединения иногда не устанавливаются по причинам, которые не видно ни одному из устройств.
Смотри также: Локальный HTTP-сервер
-
Локальный HTTP-сервер
-
Приложение, отвечающее на веб-запросы в твоей собственной сети, благодаря чему браузер на компьютере может открыть страницу, которую отдаёт твой телефон. Именно так работает Wi-Fi Transfer — без кабеля и без учётной записи.
Телефон показывает адрес; компьютер открывает его; полученную страницу отдаёт сам телефон. Файлы идут напрямую по локальной сети и никогда её не покидают.
Поскольку тот адрес может достать любой в той же сети, ему нужен замок — код для ввода, разрешения, выдаваемые на каждую операцию отдельно, и деструктивные действия, отключённые, пока их сознательно не включат.
Смотри также: WebRTC