On-Demand Resources позволяют уменьшить начальный размер приложения. Вместо того чтобы хранить все ресурсы в бинарнике,
iOS скачивает их из
App Store, когда они действительно нужны. Это работает для изображений, звуков, моделей машинного обучения, игровых уровней и других данных.
Но механизм можно применить и иначе. С его помощью можно вынести из бинарника конфигурацию и токены. Это не сделает приложение неуязвимым, но усложнит статический анализ и реверс-инжиниринг.
Как это работает:
В настройках таргета нужно включить опцию
Enable On Demand Resources. Затем ресурсы приложения связываются с тегами в разделе
Resource Tags. По этим тегам потом можно загрузить нужный набор ресурсов.
Есть три типа тегов:
- Initial install tags: скачиваются вместе с приложением из App Store.
- Prefetched tags: начинают скачиваться сразу после загрузки приложения.
- Download-only tags: скачиваются только по запросу через API.
Обертка для работы с ресурсами:
Для удобной работы можно создать класс, который управляет загрузкой и освобождением ресурсов:
final class OnDemandResource {
private let request: NSBundleResourceRequest
init(tags: Set<String>) {
request = NSBundleResourceRequest(tags: tags)
}
func pin() async throws -> Bundle {
let isFetched = await request.conditionallyBeginAccessingResources()
if !isFetched {
try await request.beginAccessingResources()
}
return request.bundle
}
func unpin() {
request.endAccessingResources()
}
}
Метод
pin запускает запрос с указанными тегами и возвращает
bundle для доступа к ресурсам. Сначала проверяется, можно ли получить ресурсы сразу. Если нет - они скачиваются из
App Store. Метод
unpin освобождает ресурсы, чтобы система могла их выгрузить.
Пример использования:
let resource = OnDemandResource(tags: ["Config"])
let bundle = try await resource.pin()
defer { resource.unpin() }
if let config = bundle.url(forResource: "Config", withExtension: "json") {
// декодировать конфигурацию и сохранить в Keychain
}
Конфигурация загружается по тегу, декодируется и сохраняется в
Keychain. После этого ресурс можно освободить.
Зачем это нужно:
Вынос токенов и конфигурации из бинарника уменьшает поверхность атаки. Статический анализ приложения становится сложнее, потому что секретов в самом файле нет.
Но важно понимать:
On-Demand Resources - это не граница безопасности. После загрузки на устройство файлы не шифруются по умолчанию. Злоумышленник с доступом к устройству может их изучить. Это дополнительный слой защиты, а не единственный.
Apple рекомендует Background Assets:
Apple отметила, что
On-Demand Resources - устаревшая технология. Для нового кода рекомендуется использовать
Background Assets. Этот фреймворк предоставляет более современный подход к загрузке ресурсов в фоне.
On-Demand Resources все еще работают и поддерживаются. Но если вы начинаете новый проект или планируете миграцию, стоит отдать свое предпочтение
Background Assets.
Вывод:
On-Demand Resources позволяют загружать ресурсы по требованию, уменьшая начальный размер приложения. Их можно использовать не только для больших файлов, но и для выноса конфигурации и токенов из бинарника.
Это повышает сложность реверс-инжиниринга, но не заменяет другие меры безопасности. После загрузки ресурсы не шифруются, и при доступе к устройству их можно изучить.
Для нового кода
Apple рекомендует
Background Assets. Но понимание
On-Demand Resources полезно, особенно при работе с существующими проектами.