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?

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

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 )


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

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

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

2
Vielen Dank! Dies sollte eine sehr vollständige Lösung sein!
WildCat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.