Katalizörle mac'e taşırken bölmeyi hariç tutun


14

Catalyst sayesinde uygulamaların mac'a taşınması nihayet mümkün , sorun, çok sayıda kapsül AppKit'i desteklemiyor. En yaygın olanı Crashlytics / Firebase olacaktır.

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

Yeni bir konu olduğundan, macOS için yapımdan bir kapsülü nasıl kaldıracağım konusunda dokümanı bulamadım, ancak iOS ve iPadO S için saklayın .

Kodda kullanmak mümkündür:

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

Ancak sorunun bir kısmı, diğer kısmı kapsülü sadece iOS için bağlamaktır ...

Kütüphane macOS için hayati olmasa da iOS'ta hala isteniyorsa en kolay / en iyi hareket tarzı ne olurdu?

Yanıtlar:


12

@Ajgryc yanıtını takiben şık bir çözüm yapabildim:

Pod dosyasında ekle

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

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

Ve sonra Fabric için çalıştırma komut dosyası oluşturma aşamasında:

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

3
Bu, tüm CocoaPod'ların MacCatalyst'e bağlanmasını devre dışı bırakmak için iyi çalışır. if target.name.start_with?("Pods")Tüm Pod hedeflerini yakalamak için üçüncü satırı değiştirin .
William Denniss

Bu artık cocoapods 1.8.4
tmm1

1
Ben her iki şekilde denedim "target.name.start_with? (" Pods ")" cocoapods 1.8.4 ile de benim için çalışmıyor, ben hata aşağıda var, kimse bana rehberlik. /Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIReworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1c1.o) içinde, Mac / Kataloğu için, / file dosyası, kullanıcılar için, "Kataloğu oluştur" /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'mimari için x86_64
Ankur Patel

1
Çalışma betiği için şunları da kullanabilirsiniz:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Honghao Zhang

Bir cevabı kakao kapsüllerine eklemek için bir yanıtı güncelleyebilir misiniz, böylece bir cevabı okuyan insanlar cevabı kaldırabilir mi? Bence bu kutunun dışında desteklenmeli. github.com/CocoaPods/CocoaPods/issues/9364
KleMiX

8

Pods- $ projectname.release.xcconfig dosyanızı projenizin Pods dizininde açın ve OTHER_LDFLAGS satırını bulun. [sdk=iphone*]Değişken adından hemen sonra ekleyin (örnek olarak benimki şu şekilde görünüyor):

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

Bu, koşullu olarak bağlantı seçeneklerini yalnızca iphone varyantlarını oluştururken ayarlar ve kapsülün OSX'e bağlanmasını önler. Tabii ki, belirttiğiniz gibi, bu pod çağıran kod ile birleştirilmesi #if !targetEnvironment(macCatalyst)ve #endifçevrelemesi gerekir ya da linker hataları alırsınız.

Bu da aynı problemi aşmamı sağladı. (Koşullu değişkenlerin yanı sıra .xcconfig dosyalarınıza ekleyebileceğiniz başka harika şeyler merak ediyorsanız, bulduğum bir referans: https://pewpewthespells.com/blog/xcconfig_guide.html )


1
Sana lütuf verdim, ama kutudan çıkıp insanların hayatını kolaylaştıracak bir çözüm verdiğim için kendi cevabımı kabul ettim, çok teşekkür ederim!
AncAinu

üzgünüm, ama bir Pods- $ projectname.release.xcconfig dosyası nerede. Onu bulamıyorum.
Ankur Patel

Benim yapılandırmamda <Proje Dizini> / Pods / Hedef Destek Dosyaları / Pods <Proje Adı>
ajgryc

xcconfig her zaman kendini geliştirdiğinden bu çözüm önerilmez pod install. Fernando Moya de Rivas'ın en iyi alternatif için verdiği cevabı okumanızı tavsiye ederim
Oz Shabat

6

Cocoapods 1.8.4 ile @ AncAinu'nun mükemmel cevabını aşağıdaki gibi uyarlamak zorunda kaldım:

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

Crashlytics'in son sürümü olan FYI artık açık kaynak kodlu ve bu nedenle gerektiğinde doğrudan Catalyst için derleniyor. Crashlytics durumunda bu kesmek artık gerekli değildir, ancak diğer eski kapsüller için yararlı olabilir.
tmm1

yukarıdaki Proje bölümünün adı, proje dosyasının adını yazmak zorundayız? target.name == "Kapsüller- [MyProjectExample]" ise. böyle bir şey mi yoksa sadece cevabı yapıştırın çünkü benim için çalışıyor
Bartu Akman

Evet, proje adınızla değiştirmelisiniz.
tmm1

Her şeyi doğru yaptım. target.name == "Kapsüller- [VPNoid]" projemi temizleyip yeniden oluşturur. ama yine de hata şikayet ediyor. Bir fikrin var mı?
Bartu Akman

1
Kaldır[]
tmm1

3

Aşağıdaki Google bölmeleriyle benim için çalışan güncellenmiş bir çözümüm var:

  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

Ben en temiz görünüyor gibi bu çözümü kullanmaya çalışıyorum, ama bu hatayı alıyorum: 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_64Ben tam olarak eksi yukarıda ne kullanıyorum GoogleMobileAdsve Google-Mobile-Ads-SDK. Bunu neden alıyorum?
fphelp

Emin değilim. Bu noktada Fabric'i kaldırma zamanı değil mi? Google'ın bunları satın alma hakkına sahip olduğunu kabul etmiyorum, ancak yaptılar ve kapatıyorlar ...
Andy

Ne yazık ki 'pod Crashlytics' kullanmak Fabric'i otomatik olarak kurar (1.10.2). Bunun neden olduğundan emin değilim ve 'Firebase / Crashlytics' kapsülünü kullanma konusunda dikkatli değilim, çünkü Google hala beta aşamasında olduğunu söylüyor :(
fphelp

3

Catalyst için desteklenmeyen çerçevelerin işlenmesinde en iyi yaklaşım için, Fernando Moya de Ri'nin çözümünü okumalısınız .

O temelde sadece böyle, Mac OSX yüklemek istemiyorum kütüphanelerini tüm bir dizi tanımlamak gerekir ki: ['Fabric', 'Crashlytics', 'Firebase/Core', ...].

Sonra, pod dosyanız şu şekilde basit görünebilir:

# 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
Teşekkürler! Bu çok eksiksiz bir çözüm olmalı!
WildCat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.