Исключить pod при портировании на mac с катализатором - PullRequest
4 голосов
/ 31 октября 2019

Портирование приложений на Mac наконец-то возможно благодаря Catalyst , проблема в том, что множество модулей не поддерживают AppKit. Наиболее распространенным является Crashlytics / Firebase.

In [...]/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics(CLSInternalReport.o), building for Mac Catalyst, but linking in object file built for iOS Simulator, file '[...]/Pods/Crashlytics/iOS/Crashlytics.framework/Crashlytics' for architecture x86_64

Поскольку это недавняя тема, я не смог найти документ о том, как удалить модуль из моей сборки для macOS, но сохранить его для iOS иiPadO S.

Можно использовать в коде:

#if !targetEnvironment(macCatalyst) 
// Code to exclude for your macOS app
#endif

Но это одна часть проблемы, другая часть заключается в том, чтобы связать модуль только для iOS .. .

Каков будет самый простой / лучший способ действий, когда библиотека не является жизненно важной для macOS, но все еще требуется для iOS?

Ответы [ 2 ]

3 голосов
/ 07 ноября 2019

Откройте файл Pods- $ projectname.release.xcconfig в каталоге Pods вашего проекта и найдите строку OTHER_LDFLAGS. Добавьте [sdk=iphone*] сразу после имени переменной (например, моя теперь выглядит так):

OTHER_LDFLAGS[sdk=iphone*] = $(inherited) -ObjC -l"MailCore-ios" -l"c++" -l"iconv" -l"resolv" -l"xml2" -l"z"

Это условно устанавливает параметры ссылки только при сборке вариантов iphone, предотвращая соединение модуля в OSX,Конечно, как вы упомянули, это нужно сочетать с #if !targetEnvironment(macCatalyst) и #endif, окружающими код, вызывающий модуль, иначе вы получите ошибки компоновщика.

Это позволило мне преодолеть ту же проблему. (И если вам интересно, какие еще интересные вещи помимо условных переменных вы можете добавить в свои файлы .xcconfig, вот ссылка, которую я нашел: https://pewpewthespells.com/blog/xcconfig_guide.html)

1 голос
/ 08 ноября 2019

После ответа @ajgryc я смог найти простое решение:

В вашем подфайле добавить

post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "Pods-[Name of Project]"
            puts "Updating #{target.name} OTHER_LDFLAGS to OTHER_LDFLAGS[sdk=iphone*]"
            target.build_configurations.each do |config|
                xcconfig_path = config.base_configuration_reference.real_path
                xcconfig = File.read(xcconfig_path)
                new_xcconfig = xcconfig.sub('OTHER_LDFLAGS =', 'OTHER_LDFLAGS[sdk=iphone*] =')
                File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
            end
        end
    end
end

А затем на этапе построения сценария запуска для Fabric:

if [[$ARCHS != "x86_64"]]; then
  "${PODS_ROOT}/Fabric/run" [your usual key]
fi
...