我正在尝试在Xcode 12(beta 5)中构建一个大型(正在开发Xcode 11!)项目,为iOS 14做准备。代码库以前是Objective-C中的,但现在它同时包含Objective-C和Swift,并使用Objective-C或Swift的pod。

我已经推出了支持Xcode 12的CocoaPods新测试版(目前为1.10.0.beta 2)。

Pod安装成功。当我进行构建时,在pod框架上出现以下错误:

为iOS模拟器构建,但链接到为iOS构建的对象文件中,用于体系结构arm64

以及可能的错误:

无法加载目标“arm64-apple-ios11.0”的标准库

当我在框架上运行lipo-info时,它有:armv7s armv7 i386 x86_64 arm64。

此前,该项目的有效架构设置为:armv7、armv7s和arm64。

在Xcode 12中,根据苹果的文档,该设置将消失。架构设置为$(ARCH_STANDARD)。我在排除的架构中没有任何设置。

这里可能发生了什么?我还没能用一个更简单的项目重现这一点。


当前回答

Xcode 13.2.1、macOS v12(蒙特雷)、目标iOS 14.0和CocoaPods 1.11.2

在包括LogRocket和/或Plaid时,我也遇到过类似的问题——它们是xcframework,在我的本地上运行良好,但它们不能建立在bitrise上。我尝试了以上所有答案:

不包括ARCHS臂64在Podfile中将ONLY_ACTIVE_ARCH设置为YES将工作空间验证为是在Podfile中将ARCHS[sdk=iphonesimulator*]设置为uname-m

它们都不起作用。

但通过指定目标iOS版本或将其删除,可以:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings['IPHONEOS_DEPLOYMENT_TARGET'] = '14.0'
      # OR
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
    end
  end
end

其他回答

我了解arm64和Xcode 12的问题,我能够通过排除iPhone模拟器的arm64架构或通过为发布方案设置ONLY_ACTIVE_ARCH来解决构建问题。然而,我仍然有问题使用pod repo推送来推送我的框架。

我发现podspec中的设置s.pod_target_xcconfig不会将此设置应用于同一podspec中定义的依赖项。我可以在Cocoapods在验证期间生成的虚拟App项目中看到它。Cocoapods验证正在运行模拟器的发布方案,当一个或多个依赖项不排除arm64或未设置为仅构建活动体系结构时,这将失败。

解决方案可以是强制Cocoapods在验证项目时添加安装后脚本,或者让它构建调试方案,因为调试方案只是构建活动体系结构。

我最终使用Xcode 11发布了我的pod以通过验证。您可以从developer.apple.com下载Xcode 11,将其作为Xcode11.app复制到Applications文件夹,然后使用sudo Xcode select--switch/Applications/Xcode11/app/Contents/developer进行切换。完成后不要忘记切换回来。

在我的案例中:Xcode 12

我在EXCLUDED_ARCHS上设置了空值,并设置了ONLY_ACTIVE_ARCH Debug=YES Release=NO Project的Build Setting

我在我的播客文件中包括了这一点:

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
        end
    end
end

它在我的模拟器iPhone 8(iOS 12)和iPhone 11 Pro Max(iOS 14)以及我的设备iPhone 7 Plus(iOS 13.4)上运行。

基本上,您必须从项目和Pod项目中排除模拟器架构的arm64。

要做到这一点,请导航到项目的Build Settings,并在Excluded Architecture中添加值为arm64的任何iOS模拟器SDK。

OR

如果您使用的是自定义XCConfig文件,您可以简单地添加此行以排除模拟器架构。EXCLUDED_ARCHS[sdk=iphone模拟器*]=臂64然后您必须对Pod项目进行同样的操作,直到所有Cocoa Pod供应商都完成了在其Podspec中添加以下内容。s.pod_target_xcconfig={'EXCLUDED_ARCHS[sdk=iphonesimulator*]'=>'arm64'}s.user_target_xcconfig={'EXCLUDED_ARCHS[sdk=iphonesimulator*]'=>'arm64'}您可以手动将排除的体系结构添加到Pod项目的构建设置中,但当您使用pod安装。取而代之的是,您可以在Podfile中添加此片段。每次运行pod安装时,它都会写入必要的构建设置。安装后执行|安装程序|安装程序.pods_project.build_configurations.each do | config|config.build_settings[“EXCLUDED_ARCHS[sdk=iphonesimulator*]”]=“arm64”终止终止

当我为VALID_ARCHS设置$(ARCH_STANDARD)以用于任何iOS模拟器SDK的调试时,这对我很有用。此外,我还为调试设置了ONLY_ACTIVE_ARCH的YES。

在xxx.framework podspec文件中,添加以下配置。避免使用包含arm64模拟器架构的pod包。

s.pod_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }
s.user_target_xcconfig = { 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'arm64' }