Поддержка нескольких платформ для Single Target в подфайле - PullRequest
0 голосов
/ 07 января 2019

Есть ли способ добавить поддержку нескольких платформ для одной цели через подфайл?

Например, мой проект является общим для iOS и Mac. Они потребляют одну и ту же кодовую базу. Поэтому вместо создания нескольких целей для одного и того же кода я добавил поддержку iOS и MacOSX в одной и той же цели. Строит нормально.

Теперь я хочу добавить зависимость через Cocoapods. Я создаю подфайл и указываю зависимость моей цели от него. Рассматриваемый модуль поддерживает несколько платформ аналогичным образом, то есть одну цель.

Но сейчас, когда я строю свой проект, он не работает для iOS.

Указание нескольких платформ в Podfile для одной цели приводит к ошибке.

И если я просто укажу платформу только как iOS или Mac, то проект не будет построен на другой платформе.

Кто-нибудь испытывал это раньше? Как я могу добавить несколько платформ для одной цели через подфайл?

P.S. - Я знаю, что могу достичь этого, создав несколько целей в своем проекте. Но я хочу оставить это как последний вариант.

Ответы [ 3 ]

0 голосов
/ 07 июня 2019
def import_pods

pod 'CorePlot'

end

target 'FirstAppWithMacOS' do
    # define your platform here.
    platform :ios, '9.0'
    import_pods
end

target 'FirstMacOSApp' do
    # define your platform here.
    platform :osx, '10.10'
    import_pods
end

Смотрите ниже изображение моего проекта:

enter image description here

0 голосов
/ 11 июня 2019

Устройство платформы управляется секциями Base SDK и Supported Platforms в Architectures в Build Settings вашей цели. Если вы не создали две разделенные цели для устройств MacOS и iOS, вам нужно будет оставить только один выбор для поддержки этих записей платформы, то есть дублировать две новые существующие конфигурации сборки для платформы MacOS, тогда вы можете настроить настройки отдельно.

Например, у вас есть существующий проект на базе iOS, и есть две конфигурации сборки по умолчанию с именами Debug и Release. Теперь попробуйте два новых для macOS, выберите основной проект Xcode -> выберите имя проекта (здесь не имя цели) -> выберите Info раздел вверху -> нажмите + кнопку в разделе Configurations -> выберите Duplicate "Debug"/"Release" Configuration -> переименуйте ее как Debug-macOS / Release-macOS или другие, переименуйте оригинал Debug / Release в Debug-iOS / Release-iOS тоже.

Теперь у вас есть две пары конфигураций для отладки и архивации целевых платформ с настройками сборки только одной цели. Вы также можете создать новую схему для разработки под MacOS, просто убедитесь, что вы выбрали правильные конфигурации в различных действиях.

Говоря с основной Podfile на cocoapods, если вы сами поддерживаете библиотеку cocoapods и хотите добавить ее в качестве зависимости, она будет лучше поддерживать платформу MacOS и iOS в вашем файле podspec, конечно, вам нужно сделать совместимость для этих платформ, AFNetworking сделал это так. Вот основная задача преобразования, не используйте API под UIKit для платформы macOS. Чтобы отличить платформу во времени компиляции, вы можете использовать эти макросы для этого,

#if TARGET_OS_IOS
   // iOS supported
#elif TARGET_OS_OSX
   // macOS supported
#endif

Если вы хотите использовать стороннюю библиотеку в своей отдельной цели проекта, сначала проверьте совместимую проблему, если она работает только для платформы iOS, вы можете указать зависимую библиотеку только для одной платформы, подобной этой,

pod 'PonyDebugger', :configurations => ['Debug-iOS', 'Release-iOS']

То же с MacOS поддерживается.

Надеюсь, это поможет!

0 голосов
/ 08 января 2019

Я сделал такую ​​же реализацию в моем проекте, который имеет 3 цели. Я создал общие блоки 'def' и затем вызвал этот shared_pods во всех 3 целях. Таким образом, это работает довольно хорошо. Я сделал только для iOS-приложения.

# Uncomment the next line to define a global platform for your project
 platform :ios, '9.0'

def shared_pods
    pod 'Stripe'
    pod 'Google/SignIn'
end

target 'App_Dev' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

    shared_pods
 end

target 'App_QA' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

    shared_pods
 end


target 'App_Release' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

    shared_pods
 end
...