Подтвердить что ты не робот

Как создать динамическую структуру без использования script для выделения срезов симулятора

Я хотел бы создать динамическую структуру и распространить ее. Он должен работать при работе на симуляторе, устройстве iPhone и иметь возможность отправлять в App Store.

Я знаю lipo благодаря этому guide. Он показывает, как мы можем объединить архитектуры симулятора с архитектурой iphone в единую динамическую структуру, которая может быть распределена без распространения исходного кода. Это позволяет мне использовать структуру как для симулятора, так и для устройства iPhone. Однако он не работает, когда я пытаюсь отправить его в App Store из-за сборки симулятора.

Карфаген предоставляет интересное решение. Он создает структуру, которая работает как для симулятора, так и для iPhone. Но когда пришло время отправить его в App Store, нам нужно запустить script, чтобы вырезать фрагменты симулятора.

Однако создатели DoubleClick for Publishers (DFP) нашли способ создать структура, которая работает как на симуляторе, так и на устройстве; Пропускает представление в App Store; И не требует никаких script для вырезания ломтиков симулятора (AFAIK). Все, что мне действительно нужно сделать, это перетащить файл GoogleMobileAds.framework в Linked Frameworks and Libraries. Немного удивительно, что мне не нужно добавлять его в Embedded Binaries, как большинство динамических фреймворков)

Я создал образец проекта, который использует DFP, который демонстрирует это.

// clone repository
git clone --recursive https://github.com/wh1pch81n/DoubleClickGoogleExample.git

// Move to correct branch
git submodule foreach 'git checkout master'
git submodule foreach 'git pull origin master' 

Теперь вы можете выбрать схему Simulation_mate и запустить приложение. Приложение покажет единый рекламный баннер внизу, чтобы показать, что объявление действительно работает.

График зависимости выглядит следующим образом.

Simulation_mate.app
   -> Mate.framework
      -> DFP.framework
         -> GoogleMobileAds.framework

Опять же, я могу запустить Simulation_mate на симуляторе, iPhone и отправить его в App Store.

Мой вопрос в том, как в мире они создали GoogleMobileAds.framework, как это? Какие шаги необходимо предпринять для создания такой структуры?

4b9b3361

Ответ 1

Как и предполагалось, GoogleMobileAds.framework представляет собой статическую структуру, а не динамическую структуру.

> file GoogleMobileAds
GoogleMobileAds: Mach-O universal binary with 5 architectures: [arm_v7: current ar archive] [arm_v7s] [i386] [x86_64] [arm64]
GoogleMobileAds (for architecture armv7):   current ar archive
GoogleMobileAds (for architecture armv7s):  current ar archive
GoogleMobileAds (for architecture i386):    current ar archive random library
GoogleMobileAds (for architecture x86_64):  current ar archive random library
GoogleMobileAds (for architecture arm64):   current ar archive

В то время как при работе file в динамической структуре вы получаете другой результат:

> file AppKit 
AppKit: Mach-O universal binary with 2 architectures: [i386: Mach-O dynamically linked shared library i386] [x86_64]
AppKit (for architecture i386): Mach-O dynamically linked shared library i386
AppKit (for architecture x86_64):   Mach-O 64-bit dynamically linked shared library x86_64

К сожалению, проблема, которую вы описываете, является известным ограничением системы распространения App Store. Теоретически правильный способ распространения вашей динамической структуры должен состоять в том, чтобы распределить полный жирный бинарный файл со всеми архитектурами, и пусть либо система сборки выкидывает ненужные архитектуры при построении, либо позволяет системе распространения App Store делать это при разрезании приложение для определенных устройств ( " slicing" ). Если я должен был догадаться, дистрибутив App Store терпит неудачу с такими фреймворками из-за поддержки iOS 8 и ниже, поскольку эти системы не поддерживают нарезку из App Store.

Причина, по которой Google создает статические библиотеки, заключается в том, чтобы поддерживать iOS 7. Глубокая причина в этот день и возраст, это создало много проблем для разработчиков, поскольку Google также настаивает на использовании CocoaPods. Статические рамки, в то время как поверхностно кажутся сначала серебряной пулей ( "нет скриптов для lipo out archs, no embedding" ), на самом деле не так уж велики. Например, если вы хотите включить некомпилированные ресурсы, статическая структура не будет делать трюк (динамические фреймворки являются пакетами, а статические фреймворки - нет).