Loại trừ pod khi chuyển sang mac với chất xúc tác


14

Chuyển ứng dụng sang mac cuối cùng cũng có thể nhờ Catalyst , vấn đề là, rất nhiều nhóm không hỗ trợ AppKit. Phổ biến nhất sẽ là 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

Vì đây là một chủ đề gần đây, tôi không thể tìm thấy tài liệu về cách xóa nhóm khỏi bản dựng của tôi cho macOS mà chỉ giữ nó cho iOS và iPadO S.

Có thể sử dụng trong mã:

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

Nhưng đó là một phần của vấn đề, phần khác là liên kết nhóm chỉ dành cho iOS ...

Điều gì sẽ là cách hành động dễ dàng nhất / tốt nhất khi thư viện không quan trọng đối với macOS nhưng vẫn muốn trên iOS?

Câu trả lời:


12

Theo câu trả lời của @ajgryc, tôi đã có thể đưa ra một giải pháp bóng bẩy:

Trong podfile của bạn thêm

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

Kể từ 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

Và sau đó trong giai đoạn xây dựng kịch bản chạy cho Fabric:

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

3
Điều này hoạt động tốt để vô hiệu hóa tất cả các Cốc Cốc không được liên kết trong MacCirthyst. Thay đổi dòng thứ ba if target.name.start_with?("Pods")để bắt tất cả các mục tiêu Pod.
William Denniss

Điều này dường như không còn hoạt động nữa với cocoapods 1.8.4
tmm1

1
Tôi đã thử cả hai cách "if target.name.start_with? (" Pods ")" không hoạt động với tôi với cocoapods 1.8.4, tôi gặp lỗi dưới đây, bất kỳ ai cũng có thể hướng dẫn cho tôi. trong /Users/ios/Desktop/xxxxxx/Pods/FirebaseAnaly Phân tích /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector 'cho kiến ​​trúc x86_64
Ankur Patel

1
Đối với tập lệnh chạy, bạn cũng có thể sử dụng:if [[ ${IS_MACCATALYST} != "YES" ]]; then "${PODS_ROOT}/Fabric/run" fi
Honghao Zhang

Bạn có thể cập nhật một câu trả lời để bao gồm một liên kết đến một vấn đề trong vỏ ca cao để những người đọc câu trả lời có thể nâng cao nó không? Điều này nên được hỗ trợ ra khỏi hộp theo ý kiến ​​của tôi. github.com/CocoaPods/CocoaPods/issues/9364
KleMiX

8

Mở tệp Pods- $ projectname.release.xcconfig trong thư mục Pods của dự án của bạn và tìm dòng KHÁC_LDFLAGS. Thêm [sdk=iphone*]ngay sau tên biến (ví dụ: của tôi bây giờ trông như thế này):

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

Điều kiện đó chỉ thiết lập các tùy chọn liên kết khi xây dựng các biến thể iphone, ngăn chặn pod được liên kết trên OSX. Tất nhiên như bạn đề cập, điều này cần được kết hợp với #if !targetEnvironment(macCatalyst)#endifxung quanh mã gọi pod hoặc bạn sẽ gặp lỗi liên kết.

Điều này cho phép tôi vượt qua cùng một vấn đề. (Và trong trường hợp bạn đang tự hỏi điều gì mát những thứ khác bên cạnh các biến có điều kiện bạn có thể thêm vào các file .xcconfig của bạn, đây là một tài liệu tham khảo tôi thấy: https://pewpewthespells.com/blog/xcconfig_guide.html )


1
Tôi đã đưa cho bạn tiền thưởng, nhưng chấp nhận câu trả lời của riêng tôi khi tôi đưa ra một giải pháp vượt trội sẽ giúp cuộc sống của mọi người dễ dàng hơn, cảm ơn bạn rất nhiều!
AncAinu

xin lỗi, nhưng đâu là tệp Pods- $ projectname.release.xcconfig. Tôi không thể tìm thấy nó.
Ankur Patel

Trong cấu hình của tôi, nó nằm trong <Thư mục dự án> / Pods / Tệp hỗ trợ đích / Pods- <Tên dự án>
ajgryc

giải pháp này không được khuyến nghị vì xcconfig luôn tự xây dựng trong mỗi pod install. Tôi khuyên bạn nên đọc câu trả lời này của Fernando Moya de Rivas để có giải pháp thay thế tốt nhất
Oz Shabat

6

Với cocoapods 1.8.4, tôi đã phải điều chỉnh câu trả lời tuyệt vời của @ AncAinu như sau:

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, bản phát hành mới nhất của Crashlytics hiện là nguồn mở và do đó biên dịch trực tiếp cho Catalyst khi cần. Việc hack này không còn cần thiết trong trường hợp của Crashlytics, nhưng có thể hữu ích với các nhóm kế thừa khác.
tmm1

Ở trên Tên của phần Dự án, chúng ta phải viết tên của tệp dự án? if target.name == "Pods- [MyProjectExample]". một cái gì đó như thế hoặc chỉ dán câu trả lời? bởi vì nó làm việc tốt nhất cho tôi
Bartu Akman

Có bạn phải thay thế bằng tên dự án của bạn.
tmm1

Tôi đã làm mọi thứ đúng. if target.name == "Pods- [VPNoid]" dọn dẹp và xây dựng lại dự án của tôi. nhưng vẫn có lỗi là phàn nàn. Bạn có ý kiến ​​gì không?
Bartu Akman

1
Gỡ bỏ []
tmm1

3

Tôi có một giải pháp cập nhật phù hợp với tôi với các nhóm Google sau:

  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

Tôi đang cố gắng sử dụng giải pháp này vì nó trông sạch sẽ nhất, nhưng tôi gặp phải lỗi này: 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_64Tôi sử dụng chính xác những gì bạn có ở trên trừ đi GoogleMobileAdsGoogle-Mobile-Ads-SDK. Tại sao tôi nhận được điều này?
fphelp

Tôi không chắc. Tại thời điểm này đã đến lúc loại bỏ Vải phải không? Tôi không đồng ý rằng Google có quyền mua chúng, nhưng họ đã làm và đang đóng cửa vì vậy ...
Andy

Đáng buồn thay, sử dụng 'pod Crashlytics' sẽ tự động cài đặt Fabric (1.10.2). Không chắc chắn tại sao điều đó xảy ra và thận trọng khi sử dụng nhóm 'Firebase / Crashlytics' vì Google nói rằng điều đó vẫn đang trong giai đoạn thử nghiệm :(
fphelp

3

Để có cách tiếp cận tốt nhất trong việc xử lý các framweork không được hỗ trợ cho Catalyst, các bạn nên đọc giải pháp của Fernando Moya de Ri .

Về cơ bản, ông nói rằng bạn chỉ cần xác định một mảng của tất cả các lib mà bạn không muốn cài đặt trên mac osx, như thế này : ['Fabric', 'Crashlytics', 'Firebase/Core', ...].

Sau đó, tệp pod của bạn có thể trông đơn giản như sau:

# 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
Cảm ơn! Đây phải là một giải pháp rất đầy đủ!
WildCat
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.