Kecualikan pod saat porting ke mac dengan katalis

14

Porting aplikasi ke mac akhirnya dimungkinkan berkat Catalyst , masalahnya adalah, banyak pod tidak mendukung AppKit. Yang paling umum adalah 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

Karena ini adalah topik terbaru, saya tidak dapat menemukan dokumen tentang cara menghapus pod dari build saya untuk macOS tetapi menyimpannya untuk iOS dan iPadO S.

Dimungkinkan untuk menggunakan kode:

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

Tapi itu salah satu bagian dari masalah, bagian lainnya adalah menautkan pod hanya untuk iOS ...

Apa yang akan menjadi tindakan yang paling mudah / terbaik saat perpustakaan tidak penting untuk macOS tetapi masih ingin di iOS?

AncAinu
sumber

Jawaban:

12

Mengikuti jawaban @ajgryc, saya bisa membuat solusi keren:

Di podfile Anda tambahkan

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

Sejak 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

Dan kemudian dalam tahap pembuatan skrip run untuk Fabric:

if [[$ARCHS != "x86_64"]]; then
  "${PODS_ROOT}/Fabric/run" [your usual key]
fi
AncAinu
sumber
3
Ini berfungsi dengan baik untuk menonaktifkan semua CocoaPod agar tidak tertaut di MacCatalyst. Ubah baris ketiga menjadi if target.name.start_with?("Pods")untuk menangkap semua target Pod.
William Denniss
Ini sepertinya tidak berfungsi lagi dengan cocoapod 1.8.4
tmm1
1
Saya mencoba kedua cara "jika target.name.start_with? (" Pods ")" tidak bekerja untuk saya juga dengan cocoapods 1.8.4, saya mendapat kesalahan di bawah ini, ada yang bisa membimbing saya. di / Pengguna/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1cone untuk file, dengan membuat file di iOS, membuat file untuk iOS, dengan file yang dibangun di iOS, untuk iOS / file, dengan file yang dibangun di iOS, untuk iOS / file. /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'untuk arsitektur x86_64
Ankur Patel
1
Untuk skrip run, Anda juga dapat menggunakan:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Honghao Zhang
Bisakah Anda memperbarui jawaban untuk menyertakan tautan ke masalah dalam pod kakao sehingga orang yang membaca jawaban dapat membatalkannya? Ini harus didukung di luar kotak menurut saya. github.com/CocoaPods/CocoaPods/issues/9364
KleMiX
8

Buka file Pods- $ projectname.release.xcconfig di direktori Pods proyek Anda, dan cari baris OTHER_LDFLAGS. Tambahkan [sdk=iphone*]segera setelah nama variabel (sebagai contoh, milik saya sekarang terlihat seperti ini):

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

Itu secara kondisional menetapkan opsi tautan hanya ketika membangun varian iphone, mencegah pod tertaut pada OSX. Tentu saja seperti yang Anda sebutkan, ini perlu dikombinasikan dengan #if !targetEnvironment(macCatalyst)dan #endifmengelilingi kode yang memanggil pod atau Anda akan mendapatkan kesalahan linker.

Ini memungkinkan saya untuk melewati masalah yang sama. (Dan jika Anda bertanya-tanya hal keren apa lagi selain variabel kondisional yang dapat Anda tambahkan ke file .xcconfig Anda, inilah referensi yang saya temukan: https://pewpewthespells.com/blog/xcconfig_guide.html )

ajgryc
sumber
1
Saya telah memberi Anda hadiah, tetapi menerima jawaban saya sendiri saat saya memberikan solusi di luar kotak yang akan membuat hidup orang lebih mudah, terima kasih banyak!
AncAinu
maaf, tetapi di mana file Pods- $ projectname.release.xcconfig. Saya tidak dapat menemukannya.
Ankur Patel
Di config saya ada di <Project Directory> / Pods / Target Support Files / Pods- <Project Name>
ajgryc
solusi ini tidak direkomendasikan karena xcconfig selalu membangun dirinya sendiri di setiap pod install. Saya akan merekomendasikan untuk membaca jawaban Fernando Moya de Rivas ini untuk alternatif terbaik
Oz Shabat
6

Dengan cocoapods 1.8.4, saya harus menyesuaikan jawaban luar biasa @ AncAinu sebagai berikut:

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
sumber
FYI, rilis terbaru Crashlytics sekarang open-source dan dengan demikian mengkompilasi langsung untuk Catalyst saat dibutuhkan. Retasan ini tidak lagi diperlukan dalam kasus Crashlytics, tetapi dapat bermanfaat dengan pod lama lainnya.
tmm1
di bagian Nama Proyek di atas, kita harus menulis nama file proyek? jika target.name == "Pods- [MyProjectExample]". sesuatu seperti itu atau tempel saja jawabannya? karena itu bekerja untuk saya
Bartu Akman
Ya, Anda harus mengganti dengan nama proyek Anda.
tmm1
Saya melakukan semuanya dengan benar. jika target.name == "Pods- [VPNoid]" bersih dan bangun proyek saya lagi. tapi kesalahan masih mengeluh. Apakah kamu punya ide?
Bartu Akman
1
Hapus[]
tmm1
3

Saya memiliki solusi terbaru yang berfungsi untuk saya dengan pod Google berikut:

  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
sumber
Saya mencoba menggunakan solusi ini karena kelihatannya paling bersih, tetapi saya mendapatkan kesalahan ini: 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_64Saya menggunakan apa yang Anda miliki di atas minus GoogleMobileAdsdan Google-Mobile-Ads-SDK. Kenapa saya mendapatkan ini?
fphelp
Saya tidak yakin. Pada titik ini saatnya menghapus Kain bukan? Saya tidak setuju bahwa Google memiliki hak untuk membelinya, tetapi mereka melakukannya dan mematikannya jadi ...
Andy
Sayangnya menggunakan 'pod Crashlytics' secara otomatis menginstal Fabric (1.10.2). Tidak yakin mengapa itu terjadi dan saya berhati-hati dalam menggunakan pod 'Firebase / Crashlytics' karena Google mengatakan bahwa itu masih dalam tahap beta :(
fphelp
3

Untuk pendekatan terbaik dalam menangani kerangka kerja yang tidak didukung untuk Catalyst, kalian harus membaca solusinya Fernando Moya de Ri .

Dia pada dasarnya mengatakan Anda hanya perlu mendefinisikan array dari semua lib yang tidak ingin Anda instal di mac osx, seperti ini: ['Fabric', 'Crashlytics', 'Firebase/Core', ...] .

Kemudian, file pod Anda dapat terlihat sederhana seperti ini:

# 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
sumber
2
Terima kasih! Ini harus menjadi solusi yang sangat lengkap!
WildCat