Добавить объявление

Выносим конфигурацию и токены из бинарника iOS

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 полезно, особенно при работе с существующими проектами.
17.10.2026 12 666