使用催化剂移植到Mac时排除Pod


14

由于Catalyst,最终可以将应用程序移植到macOS了,问题是,许多Pod不支持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的构建中删除pod的文档,但是却保留了iOS和iPadO S的文档

可以在代码中使用:

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

但是问题的一部分,另一部分是仅针对iOS链接容器...

如果该库对于macOS而言不是至关重要的,但在iOS上仍然需要,那么最简单/最佳的做法是什么?

Answers:


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

自可可足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目标。
威廉·丹尼斯

对于cocoapods 1.8.4
tmm1 '19

1
我尝试了两种方式“如果target.name.start_with?(“ Pods”)“对cocoapods 1.8.4也不起作用,我遇到了错误,任何人都可以指导我。在/Users/ios/Desktop/xxxxxx/Pods/FirebaseAnalytics/Frameworks/FIRAnalyticsConnector.framework/FIRAnalyticsConnector(FIRConnectorUtils_d79571aba36a7d46e5c6ca87a6fec1c1.o)中,为Mac Catalyst构建,但链接到为iOS创建的目标文件/ top /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目录中打开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变体时有条件地设置链接选项,从而防止Pod在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)的最佳选择的答案
奥兹·沙巴特

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现在是开源的,因此可以在需要时直接为Catalyst进行编译。在Crashlytics的情况下,不再需要此hack,但在其他旧的pod上很有用。
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我正好使用上面的内容减去GoogleMobileAdsand Google-Mobile-Ads-SDK。我为什么得到这个?
fphelp

我不确定。现在是时候删除Fabric了吗?我不同意Google有权购买它们,但是他们确实有,并且正在将其关闭...
Andy

不幸的是,使用“ pod Crashlytics”会自动安装Fabric(1.10.2)。不知道为什么会这样,并且对于使用'Firebase / Crashlytics'pod持谨慎态度,因为Google表示那仍处于beta阶段:(
fphelp

3

对于处理Catalyst上不受支持的框架的最佳方法,你们应该阅读Fernando Moya de Ri的解决方案。

他基本上说,您只需要定义一个不想在Mac OS X上安装的所有库的数组,就像这样:['Fabric', 'Crashlytics', 'Firebase/Core', ...]

然后,您的pod文件可能看起来很简单,如下所示:

# 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.