촉매로 Mac에 포팅 할 때 포드 제외


14

Catalyst 덕분에 앱을 mac으로 포팅 할 수있게되었습니다 . 문제는 수많은 포드가 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

최근 주제이므로 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
이것은 모든 CocoaPod가 MacCatalyst에서 연결되지 않도록하는 데 효과적입니다. 세 번째 줄을 변경하여 if target.name.start_with?("Pods")모든 포드 대상을 잡습니다.
William Denniss 19

이 cocoapods에 더 이상 1.8.4 작동하지 않는 것
tmm1

1
"co.kr 1.8.4에서도"target.name.start_with? ( "Pods") "가 작동하지 않으면 두 가지 방법 모두 시도했지만 오류가 발생하면 누구나 나를 안내 할 수 있습니다. /Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1c1.o)에서 Mac Catalyst 용으로 빌드하지만 객체 파일의 iOS / Desktop / iOS 시뮬레이터 용으로 빌드 된 객체 파일에 연결 건축 x86_64에 대한 /xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector '
Ankur 파텔

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 파일을 열고 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
나는 당신에게 현상금을 주었지만 사람들의 삶을 더 쉽게 만들 수있는 해결책을 제공하면서 내 자신의 대답을 받아 들였습니다. 대단히 감사합니다!
AncAinu

죄송합니다. Pods- $ projectname.release.xcconfig 파일이 있습니다. 찾을 수 없습니다.
Ankur Patel

내 구성에서는 <Project Directory> / Pods / Target Support Files / Pods- <Project Name>
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

Crashlytics의 최신 릴리스 인 FYI는 이제 오픈 소스이므로 필요할 때 Catalyst를 위해 직접 컴파일됩니다. 이 해킹은 Crashlytics의 경우 더 이상 필요하지 않지만 다른 레거시 포드에는 유용 ​​할 수 있습니다.
tmm1

위의 프로젝트 이름 부분에 프로젝트 파일의 이름을 써야합니까? target.name == "Pods- [MyProjectExample]"인 경우 그런 식으로 답을 붙여 넣습니까? 그것은 나를 위해 작동하지 않기 때문에
Bartu Akman

예, 프로젝트 이름으로 바꿔야합니다.
tmm1

나는 모든 것을 올바르게했다. target.name == "Pods- [VPNoid]"인 경우 프로젝트를 정리하고 다시 빌드하십시오. 그러나 여전히 오류는 불평입니다. 어떤 아이디어가 있습니까?
Bartu Akman

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. 왜 이걸 얻습니까?
fphelp

잘 모르겠습니다. 이 시점에서 Fabric을 제거 할 때가 아닌가? Google에 구매할 권리가 있다는 데 동의하지는 않지만 그렇게하고 종료하고 있습니다.
Andy

슬프게도 'pod Crashlytics'를 사용하면 Fabric (1.10.2)이 자동으로 설치됩니다. Google이 아직 베타 단계에 있다고 말하기 때문에 'Firebase / Crashlytics'포드 사용에 대해 왜 그런지 잘 모르고 신중해야합니다. (
fphelp

3

Catalyst에서 지원되지 않는 프레임 워크를 처리하는 가장 좋은 방법은 Fernando Moya de Ri 솔루션을 읽어보십시오 .

그는 기본적으로 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.