Проблема создания фреймворка ios с подспецификой для кокоаподов

Это моя спецификация SDK:

#
#  Be sure to run `pod spec lint Core.podspec' to ensure this is a
#  valid spec and to remove all comments including this before submitting the spec.
#
#  To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html
#  To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/
#

Pod::Spec.new do |s|
  s.name             = "TiendeoCore"
  s.version          = "0.1.10"
  s.summary          = "Tiendeo Core"
  s.homepage         = "https://www.tiendeo.com"
  s.license          = 'Custom'
  s.author           = { "Tiendeo" => "[email protected]" }
  s.platform         = :ios, '10.0'

  #REMOTE 
s.source = { "http" => "https://tiendeo.jfrog.io/tiendeo/pods/TiendeoCore/TiendeoCore-0.1.10.zip" }

  #LOCAL#   s.source = { :git => "https://gitlab.tiendeo.com/ios/core-ios.git", :tag => s.version }
  s.dependency "Governor", "~> 0.2.5"
  s.dependency "AlamofireObjectMapper", "~> 5.2"
  s.dependency "Alamofire", "~> 4.8"
  s.dependency "RealmSwift", "~> 3.11.1"
  s.dependency "RxSwift", "~> 4.2.0"
  s.default_subspec = 'Lite'

  s.subspec 'Lite' do |lite|
    lite.name = "Lite"
    #REMOTE 
lite.framework = "TiendeoCore"
    #REMOTE 
lite.vendored_frameworks = 'TiendeoCore.framework'
     #LOCAL#     lite.source_files     = ["Source/**/*.swift", "Source/Core.h"]
     #LOCAL#     lite.public_header_files = ["Source/Core.h"]
     #LOCAL#     lite.resource_bundles = {
     #LOCAL#       'TiendeoCore' => ['Source/**/*.{xib,png,jpg,json,xcdatamodeld,xcdatamodel,xcassets,ttf,lproj}']
     #LOCAL#     }
  end

  s.subspec 'Full' do |full|
    full.name = "Full"
    #REMOTE 
full.framework = "TiendeoCore"
    #REMOTE 
full.vendored_frameworks = 'TiendeoCore.framework'

    #LOCAL#     full.source_files     = ["Source/**/*.swift", "Source/Core.h"]
    #LOCAL#     full.public_header_files = ["Source/Core.h"]
    #LOCAL#     full.resource_bundles = {
    #LOCAL#       'TiendeoCore' => ['Source/**/*.{xib,png,jpg,json,xcdatamodeld,xcdatamodel,xcassets,ttf,lproj}']
    #LOCAL#     }
    full.xcconfig = {
         'OTHER_SWIFT_FLAGS' => '$(inherited) -DFULLTIENDEOCORE'
    }
    full.dependency "TiendeoAuth", "~> 0.0.6"
    full.dependency "FacebookCore", '~> 0.4.0'
  end


end

Я создаю TiendeoCore.framework для загрузки его в Cocoapods с помощью команды (у меня есть скрипт, который создает .framework и копирует архитектуру симулятора, я показываю основные команды скрипта):

xcodebuild -workspace "${WORKSPACE_PATH}" -scheme "${TARGET_NAME}" -configuration ${CONFIGURATION} -sdk iphoneos ONLY_ACTIVE_ARCH=NO ARCHS='arm64 armv7' BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE=bitcode clean build

xcodebuild -workspace "${WORKSPACE_PATH}" -scheme "${TARGET_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' ONLY_ACTIVE_ARCH=NO ARCHS='i386 x86_64' BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" ENABLE_BITCODE=YES OTHER_CFLAGS="-fembed-bitcode" BITCODE_GENERATION_MODE=bitcode clean build

Загрузка фреймворка в CocoaPods завершается успешно, но когда я устанавливаю версию в свой проект (сборка и запуск в порядке), приложение выдает эту ошибку при запуске:

dyld: Library not loaded: @rpath/Bolts.framework/Bolts
  Referenced from: /private/var/containers/Bundle/Application/43993CDF-61A7-405F-BA37-6FAD4B8B5FFF/ViewerPro-Demo.app/Frameworks/TiendeoCore.framework/TiendeoCore
  Reason: image not found

В моей подспецификации есть две подспецификации (облегченная и полная), я устанавливаю облегченную версию по умолчанию, но во время выполнения TiendeoCore.framworks выдает, что требуется зависимость от полной подспецифики, в данном случае Facebook.

В моем коде есть флаг предварительной обработки под названием FULLTIENDEOCORE, чтобы заключить исходный код, использующий зависимости полной версии:

#if FULLTIENDEOCORE
import TiendeoAuth
#endif

Таким образом, если флаг объявлен в OTHER_SWIFT_FLAGS, код будет выполнен (этот флаг добавляется в подспецификацию в полной подспецифике).

Я не знаю, что мне не хватает.

Заранее спасибо.


person Rubén López García    schedule 17.01.2019    source источник
comment
Вы решили эту проблему??? Это именно та проблема, с которой столкнулась наша команда. Может быть, вы можете поделиться некоторыми наблюдениями? Потому что я даже не могу успешно загрузить Pod, у которого есть подспецификации, как у скомпилированных вендорных фреймворков.   -  person Viktor Vostrikov    schedule 26.02.2019
comment
Привет Виктор! Мы не решили эту проблему, мы собираемся создать две отдельные цели и сгенерировать два разных .framework. И мы собираемся указать разные источники для каждого подвида. Мы считаем, что у вас не может быть одного .framework для двух subspec с разными зависимостями. Так что нас будет двое.   -  person Rubén López García    schedule 27.02.2019
comment
Мы создали два разных фреймворка, но наш основной фреймворк не может ссылаться на код из другого факультативного фреймворка. Мы используем тег #if canImport(), и он всегда терпит неудачу... Пожалуйста, приведите пример того, как мы можем получить доступ к коду из факультативного фреймворка в основной каркас??? Можем ли мы пообщаться в каком-нибудь приватном чате? Вот мой LinkedIn: linkedin.com/in/viktor-vostrikov-245975a7   -  person Viktor Vostrikov    schedule 09.03.2019


Ответы (1)


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

Если это не поможет, вы можете изучить текущие открытые проблемы подспецификации.

person Paul Beusterien    schedule 17.01.2019
comment
Можете ли вы поделиться примером успешного включения вендорных фреймворков в качестве подспецификаций? - person Viktor Vostrikov; 26.02.2019
comment
Firebase делает это, заключая vendored_framework в другую подспецификацию, которая является зависимостью подспецификации — github.com/CocoaPods/Specs/blob/master/Specs/0/3/5/Firebase/ - person Paul Beusterien; 26.02.2019
comment
Я не нашел vendored_framework в этом примере. Вот моя попытка: mainFramework.subspec 'additionalFramework' do |additionalFramework| AdditionalFramework.name = AdditionalFramework AdditionalFramework.vendored_frameworks = AdditionalFramework.framework end Теперь я ссылаюсь на полностью скомпилированный фреймворк, который является необязательным. Я также мог бы добавить зависимости CocoaPods к этому «дополнительному фреймворку», а также напрямую включить статическую инфраструктуру (я нашел ваш пост об этом в stackOverflow) mainFramework.static_framework = true Я прав или абсолютно не прав? - person Viktor Vostrikov; 26.02.2019