[ios] 촉매로 Mac에 포팅 할 때 포드 제외
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에서 원할 때 가장 쉽고 최상의 방법은 무엇입니까?
답변
@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
답변
프로젝트의 포드 디렉토리에서 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 참조하십시오 )
답변
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
답변
다음 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
답변
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