#if canImport () не находит фреймворки с CocoaPods - PullRequest
6 голосов
/ 09 марта 2019

Здравствуйте, вот наш Podspec, который имеет default_subspec и необязательный подспец (который не будет принят, поскольку значение по умолчанию уже установлено). Этот подспец имеет больше возможностей, но занимает дополнительные 8 МБ ...

`s.default_subspec = 'mainSDK'

s.subspec 'mainSDK' do |mainSDK|
mainSDK.vendored_frameworks = 'mainSDK.framework'
mainSDK.source_files = "mainSDK.framework/Headers/*.h"
end

s.subspec 'additionalSDK' do |additionalSDK|
additionalSDK.source_files = "additionalSDK.framework/Headers/*.h"
additionalSDK.vendored_frameworks =['additionalSDK.framework', 'mainSDK.framework']
end

Теперь в наш mainSDK мы включаем дополнительный SDK с #, если canImport (AdditionalSDK) Затем мы предоставляем код, связанный с дополнительным SDK, между этими флагами компилятора, например:

#if canImport(additionalSDK)
    //adding optional delegate
    class ViewController: UIViewController, OptionalDelagate
#else
    //no need for delagete
    class ViewController: UIViewController
#endif

Однако, после того, как клиент интегрирует наш mainSDK, он видит, что в этом фреймворке отсутствует модуль: AdditionalSDK.framework

Как это возможно? Мы отметили дополнительный SDK как необязательный в нашей рабочей области. Мы попытались установить AdditionalSDK в качестве -weak_framework в других флагов компоновщика (настройки сборки), но это не помогло.

Если клиент интегрирует AdditionalSDK , все работает хорошо, потому что все платформы связаны ..

& # x200B; Дополнительные зависимости, без CocoaPods работают хорошо, это просто проблема CocoaPods, или я не знаю, как его настроить

s.platform = :ios
s.ios.deployment_target = '9.0'
s.name = "mainSDK"
s.summary = "mainSDK IOS SDK"
s.requires_arc = true

# 2
s.version = "1.0.8.6.5"

s.source = { :http => "https://s3-eu-west-1.amazonaws.com/zipOfSDK.zip"}
s.framework = "UIKit"

s.source_files = "mainSDK.framework/Headers/*.h"

s.default_subspec = 'mainSDK'

s.subspec 'mainSDK' do |mainSDK|
mainSDK.vendored_frameworks = 'mainSDK.framework'
mainSDK.source_files = "mainSDK.framework/Headers/*.h"
end

s.subspec 'additionalSDK' do |additionalSDK|
additionalSDK.source_files = "additionalSDK.framework/Headers/*.h"
additionalSDK.vendored_frameworks =['additionalSDK.framework', 'mainSDK.framework']
end

s.swift_version = "4.2"

end

Ответы [ 2 ]

1 голос
/ 07 апреля 2019

Краткий ответ: Использование #if canImport(Module) не позволит вам достичь того, что вы описали в настройке закрытого источника.Я вижу некоторое недопонимание того, как работает эта условная компиляция.

Я имею в виду, что вы уже создали фреймворк.Кажется, что #if canImport разрешается во время компиляции, поэтому он не динамический.

Когда вы используете уже готовый mainSDK.framework, деталь #if canImport(additionalSDK) уже была оценена.И результат зависит от доступности 'AdditionalSDK' в цепочке сборки, когда он был собран (например, на вашем компьютере, когда вы готовите его для отправки клиентам), а не когда он связан.

Я нашел кого-тоборясь с подобной проблемой здесь: https://flint.tools/blog/finding-a-weak-linking-solution.html

Хорошая новость заключается в том, что то, чего вы хотите достичь, возможно, используя слабое связывание и совместимость с целью C .

Я работаю над небольшой статьей на эту тему, а пока вот пример репозитория с рабочей установкой, аналогичной той, что вы описали как требования:

https://github.com/amichnia/Swift-framework-with-optional-frameworks

Он поддерживает:

  • AdditionalSDK является необязательным
  • В MainSDK есть классы, использующие протоколы AdditionalSDK
  • MainSDK знает, есть ли дополнительные функциидоступно
  • Это все в настройках закрытого источника

Обновление:

Я закончил статью, которая должна описать решение более подробно,Это доступно в https://medium.com/@amichnia_31596/create-a-mostly-swift-framework-with-optional-features-7e8a9ac960f9

1 голос
/ 19 марта 2019

Нельзя этого добиться, заявив, что mainSDK - это MainTarget, а AdditionalSDK - это ваша дополнительная цель?Что я вижу, так это то, что version вы хотите по-другому, это будет просто another target.Вы можете щелкнуть правой кнопкой мыши исходную цель, выбрать дубликат из текущей цели, и после этого вы можете внести изменения, которые вы хотите связать с фреймворками, в разделе «Фазы сборки».

#check1: проверьте, что у вас есть use_frameworks!раскомментируйте вот так:

# Uncomment this line if you're using Swift
use_frameworks!

#check2: попробуйте удалить ModuleCache, если вы действительно думаете, что Framework есть и находится на правильном пути.Чтобы удалить ModuleCache, просто удалите каталог ~/Library/Developer/Xcode/DerivedData/ModuleCache, очистите проект и просто удалите производные данные, относящиеся к проекту.Когда вы выполняете обычную очистку, каталог ModuleCache обычно не перестраивается.

#check3: проверьте ваш фреймворк, чтобы увидеть, содержит ли он папку Modules с файлом module.modulemap внутри нее (щелкните правой кнопкой мыши)на вашем фреймворке> Показать в Finder> убедитесь, что ваша карта модуля есть)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...