Pod ausschließen, wenn mit Katalysator auf Mac portiert wird

14

Das Portieren von Apps auf einen Mac ist dank Catalyst endlich möglich . Das Problem ist, dass zahlreiche Pods AppKit nicht unterstützen. Am häufigsten wäre 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

Da es sich um ein aktuelles Thema handelt, konnte ich kein Dokument zum Entfernen eines Pods aus meinem Build für MacOS finden, aber für iOS und iPadO S behalten .

Es ist möglich, im Code zu verwenden:

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

Aber dieser eine Teil des Problems, der andere Teil ist, den Pod nur für iOS zu verknüpfen ...

Was wäre die einfachste / beste Vorgehensweise, wenn die Bibliothek für macOS nicht wichtig ist, aber unter iOS immer noch gewünscht wird?

AncAinu
quelle

Antworten:

12

Nach der Antwort von @ajgryc konnte ich eine schlanke Lösung finden:

In Ihrer Poddatei hinzufügen

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

Seit Cocoapods 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

Und dann in der Phase der Skripterstellung für Fabric:

if [[$ARCHS != "x86_64"]]; then
  "${PODS_ROOT}/Fabric/run" [your usual key]
fi
AncAinu
quelle
3
Dies funktioniert gut, um zu verhindern, dass alle CocoaPods in MacCatalyst verknüpft werden. Ändern Sie die dritte Zeile in if target.name.start_with?("Pods"), um alle Pod-Ziele zu erfassen.
William Denniss
Dies scheint nicht mehr mit Cocoapods 1.8.4
tmm1
1
Ich habe in beide Richtungen versucht "Wenn target.name.start_with? (" Pods ")" nicht für mich funktioniert, auch mit Cocoapods 1.8.4, ich habe unten Fehler bekommen, jeder kann mich führen. in /Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1c1.o) /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'für Architektur x86_64
Ankur Patel
1
Für das Ausführungsskript können Sie auch if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Folgendes
Können Sie eine Antwort aktualisieren, um einen Link zu einem Problem in Kakaofrüchte aufzunehmen, damit die Leser eine Antwort bewerten können? Dies sollte meiner Meinung nach sofort unterstützt werden. github.com/CocoaPods/CocoaPods/issues/9364
KleMiX
8

Öffnen Sie die Datei Pods- $ projectname.release.xcconfig im Pods-Verzeichnis Ihres Projekts und suchen Sie die Zeile OTHER_LDFLAGS. Fügen Sie [sdk=iphone*]unmittelbar nach dem Variablennamen hinzu (als Beispiel sieht mein Name jetzt so aus):

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

Dadurch werden die Verknüpfungsoptionen nur beim Erstellen von iPhone-Varianten unter bestimmten Bedingungen festgelegt, sodass der Pod nicht unter OSX verknüpft werden kann. Natürlich , wie Sie diese Bedürfnisse erwähnen, mit kombiniert werden #if !targetEnvironment(macCatalyst)und #endifden Code rund um die Schote Aufruf oder Sie Linker Fehler erhalten.

Dadurch konnte ich das gleiche Problem überwinden. (Und falls Sie sich fragen, welche anderen coolen Dinge neben bedingten Variablen Sie Ihren .xcconfig-Dateien hinzufügen können, habe ich folgende Referenz gefunden: https://pewpewthespells.com/blog/xcconfig_guide.html )

ajgryc
quelle
1
Ich habe Ihnen das Kopfgeld gegeben, aber meine eigene Antwort akzeptiert, als ich eine sofort einsatzbereite Lösung gebe, die das Leben der Menschen erleichtert. Vielen Dank!
AncAinu
Entschuldigung, aber wo ist eine Pods- $ projectname.release.xcconfig-Datei. Ich kann es nicht finden.
Ankur Patel
In meiner Konfiguration befindet es sich in <Projektverzeichnis> / Pods / Zielunterstützungsdateien / Pods- <Projektname>
ajgryc
Diese Lösung wird nicht empfohlen, da sich die xcconfig immer in jedem selbst erstellt pod install. Ich würde empfehlen, die Antwort von Fernando Moya de Rivas für die beste Alternative zu lesen
Oz Shabat
6

Mit den Cocoapods 1.8.4 musste ich die hervorragende Antwort von @ AncAinu wie folgt anpassen:

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
tmm1
quelle
Zu Ihrer Information, die neueste Version von Crashlytics ist jetzt Open Source und wird daher bei Bedarf direkt für Catalyst kompiliert. Dieser Hack ist bei Crashlytics nicht mehr erforderlich, kann aber bei anderen Legacy-Pods hilfreich sein.
tmm1
oben Name des Projektteils, müssen wir den Namen der Projektdatei schreiben? if target.name == "Pods- [MyProjectExample]". so etwas oder einfach die Antwort einfügen? weil es für mich am besten funktioniert
Bartu Akman
Ja, Sie müssen durch Ihren Projektnamen ersetzen.
tmm1
Ich habe alles richtig gemacht. if target.name == "Pods- [VPNoid]" bereinige und baue mein Projekt erneut. aber immer noch Fehler beschwert sich. Hast du eine Idee?
Bartu Akman
1
Entfernen Sie die[]
tmm1
3

Ich habe eine aktualisierte Lösung, die für mich mit den folgenden Google-Pods funktioniert:

  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
Andy
quelle
Ich versuche, diese Lösung zu verwenden, da sie am saubersten aussieht, aber ich erhalte den folgenden Fehler: 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_64Ich verwende genau das, was Sie oben haben, abzüglich des GoogleMobileAdsund Google-Mobile-Ads-SDK. Warum bekomme ich das?
fphelp
Ich bin mir nicht sicher. An diesem Punkt ist es Zeit, Fabric zu entfernen, nicht wahr? Ich bin nicht der Meinung, dass Google das Recht hatte, sie zu kaufen, aber sie haben es getan und schließen es so ...
Andy
Leider installiert Fabric (1.10.2) mit 'pod Crashlytics' automatisch. Ich bin mir nicht sicher, warum das passiert, und bin vorsichtig bei der Verwendung des Pods "Firebase / Crashlytics", da Google sagt, dass sich das noch in der Beta-Phase befindet :(
fphelp
3

Um den besten Ansatz für den Umgang mit nicht unterstützten Framweorks für Catalyst zu finden, sollten Sie die Lösung von Fernando Moya de Ri lesen .

Er sagte im Grunde, Sie müssen nur ein Array aller Bibliotheken definieren, die Sie nicht auf Mac OSX installieren möchten, wie folgt : ['Fabric', 'Crashlytics', 'Firebase/Core', ...].

Dann kann Ihre Pod-Datei so einfach aussehen:

# 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
Oz Shabat
quelle
2
Vielen Dank! Dies sollte eine sehr vollständige Lösung sein!
WildCat