Виключіть стручок при перенесенні на Mac з каталізатором


14

Передача додатків на 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?

Відповіді:


12

Після відповіді @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

Оскільки какаоди 1.8.4

post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name == "Pods-[Name of Project]"
      puts "Updating #{target.name} to exclude Crashlytics/Fabric"
      target.build_configurations.each do |config|
        xcconfig_path = config.base_configuration_reference.real_path
        xcconfig = File.read(xcconfig_path)
        xcconfig.sub!('-framework "Crashlytics"', '')
        xcconfig.sub!('-framework "Fabric"', '')
        new_xcconfig = xcconfig + 'OTHER_LDFLAGS[sdk=iphone*] = -framework "Crashlytics" -framework "Fabric"'
        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

3
Це добре працює, щоб відключити зв'язок усіх CocoaPods у MacCatalyst. Змініть третій рядок, if target.name.start_with?("Pods")щоб охопити всі цілі Pod.
Вільям Денніс

Це, здається, більше не працює з какаодами 1.8.4
tmm1

1
Я намагався в обох випадках "якщо target.name.start_with? (" Pods ")" не працює для мене також з cocoapods 1.8.4, я потрапив нижче помилки, хтось може мене керувати. в /Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1cccl, Інк., для файлів, користувач, файловий будинок, користувач, для файлів, для файлів, користувач, користувач, файл, інфабукція, користувач, файл, для файлів, користувач, для файлів, користувач, для файлів, користувач, файл, для файлів, користувач, для файлів, інфабукція, для файлів, користувач, для файлів, для користувальницького файлу. /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'для архітектури x86_64
Ankur Patel

1
Для сценарію запуску ви також можете використовувати:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Honghao Zhang

Чи можете ви оновити відповідь, щоб включити посилання на проблему в какао-стручках, щоб люди, які читали відповідь, могли викликати її? На мою думку, це повинно бути підтримано нестандартно. github.com/CocoaPods/CocoaPods/isissue/9364
KleMiX

8

Відкрийте свій файл 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
Я дав вам нагороду, але прийняв власну відповідь, коли я даю рішення, яке полегшить життя людей, дуже дякую!
AncAinu

Вибачте, але де файл Pods- $ projectname.release.xcconfig. Я не в змозі його знайти.
Анкур Патель

У моєму конфігурації це в <Каталог проектів> / Pods / Цільові файли підтримки / Pods- <Назва проекту>
ajgryc

це рішення не рекомендується, оскільки xcconfig завжди створює себе у кожному pod install. Я рекомендував би прочитати відповідь Фернандо Моя де Ріваса на кращу альтернативу
Оз Шабат

6

Що стосується какаопів 1.8.4, мені довелося адаптувати чудову відповідь @ AncAinu таким чином:

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

FYI, остання версія Crashlytics тепер є відкритим кодом і, таким чином, компілюється безпосередньо для Catalyst при необхідності. Цей злом більше не потрібен у випадку Crashlytics, але може бути корисним для інших застарілих стручків.
tmm1

вище Назва назви проекту, ми повинні написати ім'я файлу проекту? if target.name == "Pods- [MyProjectExample]". щось подібне чи просто вставити відповідь? бо це найкраще працює для мене
Барту Акман

Так, ви повинні замінити ім'я свого проекту.
tmm1

Я все зробив правильно. якщо target.name == "Pods- [VPNoid]" очистіть і складіть мій проект заново. але все ж помилка скаржиться. У тебе є ідея?
Барту Акман

1
Видалити[]
tmm1

3

У мене є оновлене рішення, яке працює для мене з такими стручками Google:

  pod 'FirebaseUI/Auth'
  pod 'FirebaseUI/Phone'
  pod 'FirebaseUI/Email'
  pod 'Firebase/Auth'
  pod 'Firebase/Analytics'
  pod 'Fabric', '~> 1.10.2'
  pod 'Firebase/Crashlytics'
  pod 'Firebase/AdMob'
post_install do |installer|
  installer.pods_project.targets.each do |target|
    if target.name.start_with?("Pods")
        puts "Updating #{target.name} to exclude Crashlytics/Fabric"
      target.build_configurations.each do |config|
        xcconfig_path = config.base_configuration_reference.real_path
        xcconfig = File.read(xcconfig_path)
        xcconfig.sub!('-framework "FirebaseAnalytics"', '')
        xcconfig.sub!('-framework "FIRAnalyticsConnector"', '')
        xcconfig.sub!('-framework "GoogleMobileAds"', '')
        xcconfig.sub!('-framework "Google-Mobile-Ads-SDK"', '')
        xcconfig.sub!('-framework "GoogleAppMeasurement"', '')
        xcconfig.sub!('-framework "Fabric"', '')
        new_xcconfig = xcconfig + 'OTHER_LDFLAGS[sdk=iphone*] = $(inherited) -framework "FirebaseAnalytics"  -framework "FIRAnalyticsConnector"  -framework "GoogleMobileAds" -framework "GoogleAppMeasurement" -framework "GoogleUtilities" "-AppMeasurement" -framework "Fabric"'
        File.open(xcconfig_path, "w") { |file| file << new_xcconfig }
      end
    end
  end
end

Я намагаюся використовувати це рішення, оскільки воно виглядає найбільш чисто, але я отримую цю помилку: ld: in /Users/<name>/source/<app>/Pods/Fabric/iOS/Fabric.framework/Fabric(Fabric.o), building for Mac Catalyst, but linking in object file built for iOS Simulator, for architecture x86_64я використовую саме те, що у вас вище мінус GoogleMobileAdsі Google-Mobile-Ads-SDK. Чому я отримую це?
fphelp

Я не впевнений. На даний момент час зняти Тканину, чи не так? Я не погоджуюся з тим, що Google мав право їх купувати, але вони це зробили і закривають так ...
Енді,

На жаль, використовуючи "pod Crashlytics", автоматично встановлюється тканина (1.10.2). Не впевнений, чому це трапляється, і я з обережністю ставлюся до користування стручком "Firebase / Crashlytics", оскільки Google каже, що це все ще знаходиться на стадії бета-версії :(
fphelp

3

Для найкращого підходу до управління непідтримуваними фреймами для Catalyst, ви, хлопці, повинні прочитати рішення Фернандо Моя де Рі .

Він в основному сказав , що просто потрібно визначити масив всіх LIBS ви не хочете , щоб встановити на Mac OSX, як це: ['Fabric', 'Crashlytics', 'Firebase/Core', ...].

Тоді ваш файл файлу може виглядати просто так:

# Podfile
load 'remove_unsupported_libraries.rb'
target 'My target' do
   use_frameworks!
   # Install your pods
   pod ...
end

# define unsupported pods
def unsupported_pods
   ['Fabric', 'Crashlytics', 'Firebase/Core', ...]
end

# install all pods except unsupported ones
post_install do |installer|
   configure_support_catalyst installer, unsupported_pods
end

2
Дякую! Це має бути дуже повним рішенням!
WildCat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.