उत्प्रेरक के साथ मैक को पोर्ट करते समय फली को बाहर निकालें


14

मैक के लिए ऐप्स को पोर्ट करना अंततः कैटेलिस्ट के लिए संभव है , समस्या यह है कि कई पॉड्स AppKit का समर्थन नहीं करते हैं। सबसे आम एक 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

चूँकि यह एक हालिया विषय है, मैं मैक के लिए अपने बिल्ड से एक पॉड को हटाने के बारे में डॉक्टर से नहीं मिल सका, लेकिन इसे आईओएस और आईपैड एस के लिए रख सकता हूं

कोड में उपयोग करना संभव है:

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

लेकिन समस्या का एक हिस्सा, दूसरा हिस्सा केवल आईओएस के लिए पॉड को जोड़ना है ...

जब पुस्तकालय macOS के लिए महत्वपूर्ण नहीं है, लेकिन फिर भी iOS पर चाहता है, तो कार्रवाई का सबसे आसान / सबसे अच्छा कोर्स क्या होगा?

जवाबों:


12

@Ajgryc जवाब के बाद, मैं एक चिकना समाधान करने में सक्षम था:

अपने पॉडफाइल ऐड में

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

चूंकि कोकोपोड्स 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

और फिर फैब्रिक के लिए रन स्क्रिप्ट बिल्ड चरण में:

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

3
यह सभी CocoaPods को MacCatalyst में लिंक होने से अक्षम करने के लिए अच्छी तरह से काम करता है। if target.name.start_with?("Pods")सभी पोड लक्ष्य को पकड़ने के लिए तीसरी पंक्ति बदलें ।
विलियम डेनिस

यह कोकोपीड्स 1.8.4
tmm1

1
मैंने दोनों तरह से कोशिश की "अगर target.name.start_with? (" पॉड्स ")" मेरे लिए भी काम नहीं करता है, तो कोकोपोड्स 1.8.4 के साथ, मुझे नीचे त्रुटि मिली, कोई भी मेरा मार्गदर्शन कर सकता है। in /User/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector/FireConnectorUtils_d79571aba36a7d46e5c6a6f6=6f6/f5/f5/f6/f= / xxxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'आर्किटेक्चर के लिए x86_64
अंकुर पटेल

1
रन स्क्रिप्ट के लिए, आप इसका उपयोग भी कर सकते हैं:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
हांगहो झांग

क्या आप कोको फली में किसी मुद्दे के लिंक को शामिल करने के लिए एक उत्तर को अपडेट कर सकते हैं ताकि एक उत्तर पढ़ने वाले लोग इसे बढ़ा सकें? यह मेरी राय में बॉक्स से बाहर का समर्थन किया जाना चाहिए। github.com/CocoaPods/CocoaPods/issues/9364
KleMiX 31

8

अपनी पॉड्स- $ projectname.release.xcconfig फाइल को अपने प्रोजेक्ट के पॉड्स डायरेक्टरी में खोलें, और OTHER_LDFLAGS लाइन का पता लगाएं। [sdk=iphone*]चर नाम के तुरंत बाद जोड़ें (उदाहरण के लिए, मेरा अब इस तरह दिखता है):

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

सशर्त रूप से लिंक विकल्प केवल तभी सेट करते हैं जब iPhone वेरिएंट का निर्माण होता है, जो पॉड को OSX पर लिंक होने से रोकता है। बेशक, जैसा कि आप उल्लेख करते हैं, इसे पॉड को कॉल करने वाले कोड के साथ #if !targetEnvironment(macCatalyst)या #endifआसपास जोड़ा जाना चाहिए या आपको लिंकर की त्रुटियां मिलेंगी।

इसने मुझे उसी समस्या से पार पाने की अनुमति दी। (और यदि आप सोच रहे हैं कि सशर्त चर के अलावा और कौन सी ठंडी चीजें आप अपनी .xcconfig फ़ाइलों में जोड़ सकते हैं, तो यहां एक संदर्भ मुझे मिला: https://pewpewthespells.com/blog/xcconfig_guide.html )


1
मैंने आपको इनाम दिया है, लेकिन मैंने अपना जवाब स्वीकार कर लिया है क्योंकि मैं बॉक्स से एक समाधान देता हूं जो लोगों के जीवन को आसान बना देगा, बहुत-बहुत धन्यवाद!
14:00 पर ancAinu

क्षमा करें, लेकिन एक Pods- $ projectname.release.xcconfig फ़ाइल कहां है। मैं इसे ढूंढ नहीं पा रहा हूं।
अंकुर पटेल

मेरे कॉन्फिगर में यह <प्रोजेक्ट डायरेक्टरी> / पॉड्स / टारगेट सपोर्ट फाइल्स / पॉड्स- <प्रोजेक्ट नेम>
ajgryc

यह समाधान अनुशंसित नहीं है क्योंकि xcconfig हमेशा हर में खुद का निर्माण करता है pod install। मैं सबसे अच्छा विकल्प के लिए इस फर्नांडो मोया डी रिवास के जवाब को पढ़ने की सिफारिश करूंगा
ओज शबात

6

1.8.4 cocoapods के साथ, मुझे @ AncAinu के उत्कृष्ट उत्तर को इस प्रकार बदलना पड़ा:

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

FYI करें, Crashlytics की नवीनतम रिलीज़ अब ओपन-सोर्स है और इस प्रकार जब आवश्यक हो तो सीधे उत्प्रेरक के लिए संकलन करती है। इस हैक को अब क्रैशलाईटिक्स के मामले में आवश्यक नहीं है, लेकिन अन्य विरासत पॉड्स के साथ उपयोगी हो सकता है।
tmm1

ऊपर में परियोजना का नाम भाग, हम परियोजना फ़ाइल का नाम लिखना है? अगर target.name == "पॉड्स- [MyProjectExample]"। ऐसा कुछ या सिर्फ जवाब चिपकाएँ? क्योंकि यह मेरे लिए काम करता है
बार्टु अकमन

हां, आपको अपने प्रोजेक्ट का नाम बदलना होगा।
tmm1

मैंने सब कुछ ठीक किया। अगर target.name == "पॉड्स- [VPNoid]" फिर से मेरे प्रोजेक्ट को क्लीन और बिल्ड करता है। लेकिन फिर भी त्रुटि शिकायत कर रही है। क्या आपके पास कोई विचार है?
बार्टू अकमन

1
निकालें[]
tmm1

3

मेरे पास एक अद्यतन समाधान है जो निम्न 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

मैं इस समाधान का उपयोग करने की कोशिश कर रहा हूं क्योंकि यह सबसे साफ दिखता है, लेकिन मुझे यह त्रुटि मिलती है: 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_64मैं बिल्कुल वही उपयोग करता हूं जो आपके पास माइनस- GoogleMobileAdsएंड से ऊपर है Google-Mobile-Ads-SDK। मुझे यह क्यों मिल रहा है?
22

मुझे यकीन नहीं है। इस समय यह फैब्रिक हटाने का समय है? मैं इस बात से सहमत नहीं हूं कि Google के पास उन्हें खरीदने का अधिकार था, लेकिन उन्होंने ऐसा किया और इसे बंद कर रहे हैं ...
एंडी

अफसोस की बात है कि 'पॉड क्रैशलाईटिक्स' का उपयोग करने से फैब्रिक (1.10.2) अपने आप स्थापित हो जाता है। निश्चित नहीं है कि ऐसा क्यों होता है और 'फायरबेस / क्रैशलाईटिक्स' पॉड का उपयोग करने के बारे में सतर्क हूं क्योंकि Google कहता है कि अभी भी बीटा चरण में है :(
fphelp

3

उत्प्रेरक के लिए असमर्थित फ्रैमवेर्क से निपटने के सर्वोत्तम दृष्टिकोण के लिए, आप लोगों को फर्नांडो मोया डे री का समाधान पढ़ना चाहिए ।

उन्होंने कहा कि मूल रूप से आपको मैक ओएसएक्स पर इस तरह से स्थापित किए जाने वाले सभी कार्यों की एक सरणी को परिभाषित करने की आवश्यकता है, जैसे ['Fabric', 'Crashlytics', 'Firebase/Core', ...]:।

तब, आपकी पॉड फ़ाइल इस प्रकार सरल दिख सकती है:

# 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
धन्यवाद! यह एक बहुत ही पूर्ण समाधान होना चाहिए!
वाइल्डकैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.