ยกเว้นพ็อดเมื่อทำการย้ายไปยัง mac ด้วยตัวเร่งปฏิกิริยา


14

ในที่สุดการย้ายแอปไปยัง Mac ก็ทำได้ด้วยCatalystปัญหาคือพ็อดจำนวนมากไม่รองรับ 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

เนื่องจากเป็นหัวข้อที่ผ่านมาฉันไม่สามารถหาเอกสารเกี่ยวกับวิธีลบพ็อดออกจาก build ของฉันสำหรับ macOS แต่เก็บไว้สำหรับ iOS และ iPadO S

มันเป็นไปได้ที่จะใช้ในรหัส:

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

แต่ส่วนหนึ่งของปัญหาส่วนอื่นคือการเชื่อมโยงพ็อดสำหรับ iOS เท่านั้น ...

สิ่งที่จะเป็นวิธีที่ง่ายที่สุด / ดีที่สุดของการกระทำเมื่อห้องสมุดไม่สำคัญสำหรับ macOS แต่ยังต้องการใน iOS?

คำตอบ:


12

การทำตามคำตอบ @ajgryc ฉันสามารถแก้ปัญหาที่ทันสมัยได้:

ใน podfile ของคุณเพิ่ม

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

จากนั้นในการรันสคริปต์สร้างเฟสสำหรับ Fabric:

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

3
วิธีนี้ใช้งานได้ดีเพื่อปิดการใช้งาน CocoaPods ทั้งหมดจากการเชื่อมโยงใน MacCatalyst เปลี่ยนบรรทัดที่สามเป็นif target.name.start_with?("Pods")เพื่อจับเป้าหมาย Pod ทั้งหมด
วิลเลียม Denniss

ดูเหมือนว่ามันจะไม่ทำงานอีกต่อไปกับ cocoapods 1.8.4
tmm1

1
ฉันลองทั้งสองวิธี "ถ้า target.name.start_with? (" พ็อด ")" ไม่ทำงานสำหรับฉันด้วย cocoapods 1.8.4 ฉันพบข้อผิดพลาดด้านล่างทุกคนสามารถแนะนำฉันได้ ใน /Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConverter สำหรับไฟล์ / ผู้ใช้งานสร้างไฟล์สำหรับเครื่องแมคเดอเรชั่น / สำหรับผู้ใช้งานระบบปฏิบัติการที่ใช้การสร้างไฟล์ / สำหรับผู้ใช้งานในระบบปฏิบัติการ / การสร้างไฟล์ /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'สำหรับสถาปัตยกรรม x86_64
Ankur Patel

1
สำหรับสคริปต์เรียกใช้คุณสามารถใช้:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Honghao Zhang

คุณสามารถอัปเดตคำตอบเพื่อรวมลิงก์ไปยังปัญหาในฝักโกโก้เพื่อให้คนที่อ่านคำตอบสามารถโหวตได้หรือไม่? สิ่งนี้ควรได้รับการสนับสนุนนอกกรอบในความคิดของฉัน github.com/CocoaPods/CocoaPods/issues/9364
KleMiX

8

เปิดไฟล์ Pods- $ projectname.release.xcconfig ในไดเรกทอรี Pods ของโครงการของคุณและค้นหาบรรทัด 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ล้อมรอบโค้ดที่เรียกพ็อดหรือคุณจะได้รับข้อผิดพลาดของ linker

สิ่งนี้ทำให้ฉันสามารถแก้ไขปัญหาเดียวกันได้ (และในกรณีที่คุณสงสัยว่าอะไรเจ๋ง ๆ นอกเหนือจากตัวแปรตามเงื่อนไขคุณสามารถเพิ่มลงในไฟล์. xcconfig ของคุณได้นี่คือข้อมูลอ้างอิงที่ฉันพบ: https://pewpewthespells.com/blog/xcconfig_guide.html )


1
ฉันให้รางวัลแก่คุณ แต่ยอมรับคำตอบของตัวเองเมื่อฉันให้ทางออกจากกล่องซึ่งจะทำให้ชีวิตของผู้คนง่ายขึ้นขอบคุณมาก!
AncAinu

ขออภัยที่เป็นไฟล์ Pods- $ projectname.release.xcconfig ฉันหามันไม่เจอ
Ankur Patel

ในการกำหนดค่าของฉันมันอยู่ใน <ไดเรกทอรีโครงการ> / Pods / ไฟล์สนับสนุนเป้าหมาย / Pods- <ชื่อโครงการ>
ajgryc

การแก้ปัญหานี้ไม่แนะนำให้เป็น xcconfig pod installเสมอสร้างตัวเองในทุก ฉันอยากจะแนะนำให้อ่านคำตอบของ Fernando Moya de Rivasสำหรับทางเลือกที่ดีที่สุด
Oz Shabat

6

ด้วย cocoapods 1.8.4 ฉันต้องปรับคำตอบที่ยอดเยี่ยมของ @ 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 รุ่นล่าสุดในขณะนี้เป็นโอเพ่นซอร์สและรวบรวมโดยตรงสำหรับ Catalyst เมื่อต้องการ การแฮ็คนี้ไม่จำเป็นต้องใช้ในกรณีของ Crashlytics อีกต่อไป แต่จะมีประโยชน์กับพ็อดแบบดั้งเดิม
tmm1

ในข้างต้นชื่อของส่วนโครงการเราต้องเขียนชื่อไฟล์โครงการหรือไม่ if target.name == "Pods- [MyProjectExample]" อะไรแบบนั้นหรือเพียงแค่วางคำตอบ? เพราะมันทำงานได้ดีสำหรับฉัน
Bartu Akman

ใช่คุณต้องแทนที่ด้วยชื่อโครงการของคุณ
tmm1

ฉันทำทุกอย่างถูกต้องแล้ว ถ้า target.name == "Pods- [VPNoid]" ล้างและสร้างโครงการของฉันอีกครั้ง แต่ข้อผิดพลาดก็ยังคงบ่น คุณมีความคิดใด ๆ
Bartu Akman

1
ลบ the[]
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ทำไมฉันถึงได้รับสิ่งนี้?
fphelp

ฉันไม่แน่ใจ. ณ จุดนี้ถึงเวลาที่จะลบเนื้อผ้าออกแล้วใช่ไหม ฉันไม่เห็นด้วยว่า Google มีสิทธิ์ที่จะซื้อพวกเขา แต่พวกเขาทำและกำลังปิดตัวลงดังนั้น ...
Andy

น่าเศร้าที่ใช้ 'pod Crashlytics' จะติดตั้ง Fabric (1.10.2) โดยอัตโนมัติ ไม่แน่ใจว่าทำไมถึงเกิดขึ้นและระมัดระวังเกี่ยวกับการใช้พ็อกเก็ต 'Firebase / Crashlytics' เพราะ Google บอกว่ายังอยู่ในช่วงเบต้า :(
fphelp

3

สำหรับวิธีที่ดีที่สุดในการจัดการ framweorks ไม่สนับสนุนสำหรับตัวเร่งปฏิกิริยาที่พวกคุณควรอ่านวิธีการแก้ปัญหาของเฟอร์นันโดโมเดอรี

เขากล่าวว่าโดยทั่วไปคุณเพียงแค่ต้องกำหนดอาร์เรย์ทั้งหมดของ libs ที่คุณไม่ต้องการที่จะติดตั้งบน Mac OSX, ['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
ขอบคุณ! นี่ควรเป็นทางออกที่สมบูรณ์มาก!
WildCat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.