Escludere pod quando si esegue il porting su Mac con catalizzatore


14

Il porting di app su Mac è finalmente possibile grazie a Catalyst , il problema è che numerosi pod non supportano AppKit. Il più comune sarebbe 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

Dato che è un argomento recente, non sono riuscito a trovare un documento su come rimuovere un pod dalla mia build per macOS ma conservarlo per iOS e iPadO S.

È possibile utilizzare nel codice:

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

Ma quella parte del problema, l'altra parte è quella di collegare il pod solo per iOS ...

Quale sarebbe il modo più semplice / migliore di agire quando la libreria non è vitale per macOS ma è ancora desiderata su iOS?

Risposte:


12

Dopo la risposta di @ajgryc, sono stato in grado di creare una soluzione elegante:

Nel tuo podfile aggiungi

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

Dal momento che 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

E poi in fase di esecuzione dello script di esecuzione per Fabric:

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

3
Funziona bene per disabilitare il collegamento di tutti i CocoaPod in MacCatalyst. Cambia la terza linea in if target.name.start_with?("Pods")per catturare tutti i bersagli Pod.
William Denniss,

Questo non sembra funzionare più con i cocoapodi 1.8.4
tmm1

1
Ho provato in entrambi i modi "if target.name.start_with? (" Pods ")" non funziona per me anche con i cocoapods 1.8.4, sono arrivato sotto l'errore, chiunque può guidarmi. in /Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1c1.o), costruendo per Mac Catalyst, ma il collegamento nel file oggetto costruito per iOS Simulator, il file '/ Users / ios / Desktop /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'for architecture x86_64
Ankur Patel

1
Per lo script di esecuzione, puoi anche utilizzare:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Honghao Zhang l'

Puoi aggiornare una risposta per includere un collegamento a un problema nei contenitori di cacao in modo che le persone che leggono una risposta possano votarla? A mio avviso, questo dovrebbe essere supportato immediatamente. github.com/CocoaPods/CocoaPods/issues/9364
KleMiX

8

Apri il tuo file Pods- $ projectname.release.xcconfig nella directory Pods del tuo progetto e individua la riga OTHER_LDFLAGS. Aggiungi [sdk=iphone*]subito dopo il nome della variabile (ad esempio, il mio ora appare così):

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

Ciò imposta in modo condizionale le opzioni di collegamento solo quando si creano varianti di iPhone, impedendo che il pod venga collegato su OSX. Ovviamente, come accennato, questo deve essere combinato con #if !targetEnvironment(macCatalyst)e #endifattorno al codice che chiama il pod o otterrai errori del linker.

Questo mi ha permesso di superare lo stesso problema. (E nel caso ti stai chiedendo quali altre cose interessanti oltre alle variabili condizionali che puoi aggiungere ai tuoi file .xcconfig, ecco un riferimento che ho trovato: https://pewpewthespells.com/blog/xcconfig_guide.html )


1
Ti ho dato la generosità, ma ho accettato la mia risposta mentre do una soluzione pronta all'uso che renderà la vita delle persone più facile, grazie mille!
AncAinu,

scusa, ma dov'è un file Pods- $ projectname.release.xcconfig. Non riesco a trovarlo.
Ankur Patel

Nella mia configurazione è in <Directory progetto> / Pods / File di supporto destinazione / Pods- <Nome progetto>
ajgryc

questa soluzione non è consigliata poiché xcconfig si costruisce sempre in ogni pod install. Consiglierei di leggere questa risposta di Fernando Moya de Rivas per la migliore alternativa
Oz Shabat

6

Con i cocoapodi 1.8.4, ho dovuto adattare la risposta eccellente di @AncAinu come segue:

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

Cordiali saluti, l'ultima versione di Crashlytics è ora open-source e quindi compila direttamente per Catalyst quando necessario. Questo hack non è più necessario nel caso di Crashlytics, ma può essere utile con altri pod legacy.
tmm1

sopra Nome della parte del progetto, dobbiamo scrivere il nome del file di progetto? if target.name == "Pods- [MyProjectExample]". qualcosa del genere o semplicemente incollare la risposta? perché funziona davvero per me
Bartu Akman,

Sì, è necessario sostituire con il nome del progetto.
tmm1

Ho fatto tutto bene. if target.name == "Pods- [VPNoid]" pulisci e costruisci di nuovo il mio progetto. ma l'errore si lamenta ancora. Ne hai idea?
Bartu Akman,

1
Rimuovere il[]
tmm1

3

Ho una soluzione aggiornata che funziona per me con i seguenti pod di 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

Sto cercando di utilizzare questa soluzione come sembra la più pulita, ma ottengo questo errore: 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_64uso esattamente quello che hai sopra meno il GoogleMobileAdse Google-Mobile-Ads-SDK. Perché sto ricevendo questo?
fphelp

Non ne sono sicuro. A questo punto è tempo di rimuovere Fabric non è vero? Non sono d'accordo sul fatto che Google abbia il diritto di acquistarli, ma lo hanno fatto e lo stanno chiudendo così ...
Andy,

Purtroppo usando "pod Crashlytics" si installa automaticamente Fabric (1.10.2). Non so perché ciò accada e sono cauto nell'utilizzare il pod "Firebase / Crashlytics" perché Google afferma che è ancora in fase beta :(
fphelp

3

Per il miglior approccio di gestione dei framweorks non supportati per Catalyst, dovreste leggere la soluzione di Fernando Moya de Ri .

Ha detto in sostanza è sufficiente per definire una matrice di tutte le librerie che non si desidera installare su Mac OSX, in questo modo: ['Fabric', 'Crashlytics', 'Firebase/Core', ...].

Quindi, il tuo file pod può apparire semplice come questo:

# 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
Grazie! Questa dovrebbe essere una soluzione molto completa!
WildCat
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.