我正在尝试在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)。我在排除的架构中没有任何设置。

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


我找到了解决方案!SwiftUI预览无法使用Firebase

如果您将模拟器的排除架构设置为arm64,它将编译。


我相信我找到了答案。根据Xcode 12 beta 6发行说明:

“生成设置”编辑器不再包含有效体系结构生成设置(Valid_ARCHS),因此不鼓励使用它。取而代之的是新的“排除体系结构”生成设置(Excluded_ARCHS)。如果项目包含Valid_AARCHS,则该设置将显示在生成设置编辑器的“用户定义”部分中。(15145028)

我能够通过手动编辑项目文件(我无法确定如何使用Xcode从项目文件中删除该项)并删除所有引用VALID_ARCHS的行来解决此问题。之后,我可以很好地为模拟器进行构建。


Xcode 12中已删除有效体系结构构建设置。如果此生成设置中有值,则它们会导致问题,需要删除。

我能够“清除”VALID_ARCHS构建设置,方法是将其作为用户定义的构建设置(没有值)添加回,运行项目(失败),然后删除VALID_AARCHS构建设置。之后,我可以在模拟器上运行了。

我的体系结构构建设置是标准体系结构。

您可以从“生成设置”中的加号按钮添加用户定义的设置:


升级到Xcode 12后,我仍然能够为真正的设备构建,但不能为模拟器构建。Podfile构建仅适用于真实设备。

我在Build Settings(构建设置)>User Defined(用户定义)下删除了VALID_ARCHS,它成功了!在发现这个之前,我先捶了一下脑袋。


这里的问题是Xcode 11中的有效架构。在Xcode 11中打开项目,并将项目、目标和Pods的Valid架构值更改为$(ARCHS_SESTANDARD)。在Xcode 12中重新打开项目并构建。


我通过在项目目标和pod目标的“排除架构”中添加“arm64”来解决这个问题。

X代码→ 目标项目→ 生成设置→ 排除的体系结构→ *“臂64”

X代码→ 吊舱目标→ 生成设置→ 排除的体系结构→ *“臂64”


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

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

基本上,您必须从项目和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”终止终止


在我的案例中:

我有四种配置(+DebugQa和ReleaseQa)。Cocoapods用作依赖关系管理器。

对于DebugQa,我在设备和模拟器上收集数据,而在ReleaseQa上只在设备上收集数据。

它有助于在PodsProject中将BuildActiveArchitecture设置为“yes”。


在我的例子中,我试图在发布模式下运行watchOS 7模拟器,但iOS 14模拟器处于调试模式。

因此,简单地将两个模拟器置于调试/发布模式就解决了我的问题!


X代码12

从“用户定义”组下的“生成”设置中删除VALID_ARCH对我有效。


如果您在Xcode 12中遇到模拟器(而不是真实设备)的问题,是的,您必须删除VALID_ARCHS设置,因为它不再受支持。转到“构建设置”,搜索“VALID_ARCHS”,然后删除用户定义的财产。在你拥有的每一个目标中都做到这一点。

不过,您可能需要在pod文件的底部添加一个脚本,以便使用正确的体系结构和部署目标编译pod:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings.delete 'IPHONEOS_DEPLOYMENT_TARGET'
      config.build_settings['ONLY_ACTIVE_ARCH'] = 'NO'
     end
  end
end

在我的案例中: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)上运行。


将“仅构建活动体系结构”(Only_Active_ARCH)构建设置设置为yes,xcode要求arm64,因为Silicon MAC体系结构是arm64。

arm64已被添加为Xcode12中的模拟器拱门,以支持Silicon MAC。

/应用程序/Xcode.app/Contents/Developer/Platforms/iPhone模拟器.platform/Developer/SDKs/iPhone模拟器.sdk/SDKSettings.json


对我来说,以下设置有效:

生成设置→ 排除的体系结构。

我在“任何iOS模拟器SDK”选项的发布和调试模式中都添加了“arm64”。


TL;博士;

将库/应用程序的“仅构建活动体系结构(Only_Active_ARCH)”设置为“是”,即使在发布模式下也是如此。


在试图确定问题的根本原因时,我意识到Xcode 12的一些有趣的事实。

Xcode 12实际上是Apple silicon的垫脚石,遗憾的是(当答案写出来时)它还没有问世。但有了这个平台,我们将得到一个基于arm64的macOS,模拟器也将在arm64架构上运行,这与目前基于Intel的x86_64架构不同。Xcode通常依赖于“运行目标”来构建其库/应用程序。因此,当模拟器被选择为“运行目的地”时,它会为可用的模拟器架构构建应用程序,而当设备被选为“运行目标”时,则会为设备支持的架构(arm*)构建应用程序。Xcode 12+构建系统中的xcodebuild认为arm64是模拟器支持Apple silicon的有效架构。因此,当选择模拟器作为运行目标时,它也可以尝试编译/链接基于arm64的模拟器的libs/apps。因此,它以<architecture>-<os>-<sdk>-<destination>格式发送clang(++)一些目标标志,如arm64-apple-ios13.0-simulator,clang尝试构建/链接基于arm64的模拟器,最终在基于Intel的Mac上失败。但xcodebuild仅对Release版本尝试此操作。为什么?因为,对于“Release”配置,“Build Active Architecture Only(Only_Active_ARCH)”构建设置通常设置为“No”。这意味着xcodebuild将尝试为发布版本的选定运行目标构建libs/apps的所有架构变体。对于模拟器运行目的地,现在它将包括x86_64和arm64,因为Xcode 12+中的arm64也是模拟器支持Apple silicon的支持架构。

简单地说,Xcode在尝试命令行xcodebuild(默认为releasebuild,请参见项目设置的常规选项卡)或其他方式并尝试构建运行目标支持的所有体系结构变体时,将无法构建应用程序。因此,解决此问题的一个简单方法是在库/应用程序中将“仅构建活动体系结构(Only_Active_ARCH)”设置为“是”,即使在发布模式下也是如此。

如果库包含为Pods,并且您可以访问.podspec,则可以简单地设置:

spec.pod_target_xcconfig={“ONLY_ACTIVE_ARCH”=>“是”}

spec_user_target_xcconfig={'ONLY_ACTIVE_ARCH'=>'YES'}#否推荐

我个人不喜欢第二行,因为pods不应该污染目标项目,而且它本身可以在目标设置中被覆盖。因此,消费者项目应该负责以某种方式覆盖设置。然而,这可能是成功的柱脚过梁所必需的。

但是,如果您没有访问.podspec的权限,您可以在安装pod期间始终更新设置:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
    end
  end
end

我担心的一件事是,当我们实际归档库和应用程序时,这会产生什么影响。在归档过程中,应用程序通常采用“Release”配置,因为这将创建一个只考虑当前运行目标的活动体系结构的版本构建,因此使用这种方法,我们可能会从目标构建中丢失armv7、armv7等的切片。然而,我注意到文档中说(在所附图片中突出显示),当我们选择“通用iOS设备/任何设备”作为运行目标时,将忽略此设置,因为它没有定义任何特定的架构。所以我想,如果我们将我们的应用程序归档,并将其作为跑步目的地,我们应该会很好。


将“生成配置”切换回“调试”模式,或为“调试”和“发布”模式启用“仅生成活动体系结构”。

原因是您的库/框架不支持新的模拟器架构ARM64(在Mac上运行,带有Apple硅处理器)。


我在从命令行构建框架时遇到了问题。我的框架依赖于其他缺少对基于ARM的模拟器支持的框架。我最终排除了对基于ARM的模拟器的支持,直到我升级了依赖项。

从命令行构建模拟器框架时,我需要EXCLUDED_ARCHS=arm64标志。

xcodebuild archive -project [project] -scheme [scheme] -destination "generic/platform=iOS Simulator" -archivePath "archives/[scheme]-iOS-Simulator" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES EXCLUDED_ARCHS=arm64

在生成设置中搜索VALID_ARCH,然后按delete。这应该适用于Xcode 12.0.1


将行“arm64”(不带引号)添加到路径:Xcode*→ 项目→ 生成设置→ 体系结构→ 排除的架构。

此外,对Pods执行同样的操作。在这两种情况下,对于调试和发布字段。

或者详细地说。。。

这里提到的使用Xcode 12部署到模拟器时的错误也是影响我的一个因素。只需右键单击我的每个项目并在finder中显示,在Atom中打开.xcodeproj,然后通过.pbxproj并删除所有VALIDARCHS设置。这就是它对我起作用的原因。

我尝试了其他一些建议(不包括arm64,仅构建活动体系结构),这些建议似乎让我的构建更进一步,但最终让我陷入了另一个错误。首先检查VALIDARCH设置可能是最好的。


在尝试了这个问题的几乎所有答案并阅读了苹果开发者论坛后,我发现只有一个解决方案适合我。

我正在构建一个通用框架,该框架在Swift应用程序中使用。我无法在没有架构错误的情况下构建模拟器。

在我的框架项目中,我在构建阶段有一个通用框架任务。如果你是这样的话:

在构建阶段将以下内容添加到xcodebuild任务中:EXCLUDED_ARCHS=“arm64”

接下来,您必须更改以下项目生成设置:

删除VALID_ARCHS用户定义的设置将ONLY_ACTIVE_ARCH设置为YES***

***如果您正在开发一个框架,并且有一个演示应用程序,则必须在两个项目中都启用此设置。


仅添加任何iOS模拟器SDK→ x86_64到项目的生成设置→ VALID_ARCHS适用于我。

Xcode版本:12.1(12A7403)

如果您的项目包含一些不支持x86_64的框架。

您可以将这些框架名称(xxx.framework)添加到Target→ 生成设置→ 排除的源文件名→ 调试→ 任何iOS模拟器SDK。然后修改框架搜索路径以删除这些框架的路径以进行调试→ 任何iOS模拟器SDK。

这两种设置可以避免Xcode在模拟器模式下构建和链接这些框架。


更新:2020年10月

您只需在Excluded Architecture下为Debug>Simulator-iOS 14.O SDK设置arm64即可。


为模拟器编译时出现问题:

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

Xcode 12.1, Pod 1.9.1

我的项目结构

主要目标共享扩展名通知服务扩展子模块,自定义框架播客文件

将arm64添加到构建设置->排除所有目标中的体系结构。从VALID_ARCHS中删除arm64,并在所有目标中添加x86_64。在podfile中添加以下代码安装后执行|安装程序|安装程序.pods_project.build_configurations.each do | config|config.build_settings[“EXCLUDED_ARCHS[sdk=iphonesimulator*]”]=“arm64”终止终止更新了pod,删除了podfile.lock,并安装了pod做一个干净的构建。


首先,为Pod项目生成x86_64!!!!

post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['ARCHS'] = "arm64 x86_64"
        end
    end
end

其次,为VALID_ARCHS添加“x86_64”。

我在网上尝试了很多无用的答案后发现了这一点,这对我很有用。


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


我了解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,本文档将指导您找到一种适用于大多数情况的解决方法。很快,Carthage构建了胖框架,这意味着该框架包含所有受支持架构的二进制文件。在引入Apple Silicon之前,它都工作得很好,但现在出现了冲突,因为存在重复的架构(arm64用于设备,arm64用于模拟器)。这意味着迦太基无法将特定于架构的框架链接到单个胖框架。

你可以按照这里的说明操作。迦太基XCODE 12

然后配置迦太基。在构建设置中将arm64置于“排除的体系结构”中。

尝试使用模拟器运行项目。模拟器应运行无任何错误。


排除arm64后,我总是得到ARCHS[@]:未绑定变量。对我来说,唯一的解决方案是将x86_64添加到此处提到的目标构建设置中。升级到Xcode 12:ld:building For iOS Simulator后出现问题,但链接到dylib build For iOS,架构arm64。您也可以删除之前添加的exclude arm64。


X代码12.3

我通过将“验证工作区”设置为“是”来解决此问题


在尝试并搜索了不同的解决方案后,我认为最安全的方法是在Podfile末尾添加以下代码

post_install do |pi|
   pi.pods_project.targets.each do |t|
       t.build_configurations.each do |bc|
          bc.build_settings['ARCHS[sdk=iphonesimulator*]'] =  `uname -m`
       end
   end
end

这样,您只能将iOS模拟器的编译器架构覆盖为当前的cpu架构。与其他解决方案相比,该解决方案也适用于使用Apple Silicon的计算机。


1.将arm64添加到构建设置->排除所有目标中的体系结构。

2.关闭Xcode并按照以下步骤打开

右键单击Finder中的Xcode显示简介用Rosetta打开


建议的答案过时/不正确。

您应该首先尝试更新CocoaPods和库/应用程序的依赖项,如果不起作用,请联系您正在使用的任何依赖项的供应商,看看他们是否正在进行更新,以在M1 Mac上添加对arm64模拟器切片的支持。

这里有很多答案标记为正确,建议您将arm64从支持的体系结构列表中排除。这充其量是一个非常临时的解决方法,最坏的情况是它会将此问题传播给库的其他用户。如果您排除arm64模拟器切片,则会对您在模拟器中开发的应用程序产生性能影响(这反过来会导致您在开发惊人创意时,闪亮的新M1套件的电池时间减少)。


我发现了

使用Rosetta(在Finder中查找Xcode>获取信息>使用Rosetta打开)在项目和目标中,仅将“构建活动体系结构”设置为“是”(您可能不需要它,请阅读下面的评论)并将其包含在podfile中:

post_install do |installer|
  installer.pods_project.targets.each do |target|
    target.build_configurations.each do |config|
      config.build_settings["ONLY_ACTIVE_ARCH"] = "YES"
    end
  end
end

为我工作。

我们有Pods和SPM,但它们不能处理其他答案的任何组合。我的同事们都使用Intel MacBook,一切仍然适用于他们!


请不要忘记在将arm64添加到排除的体系结构后清理构建文件夹。

您可以通过进入菜单>产品>清理构建文件夹或简单地按Command+Shift+K来完成此操作。


当我遇到这个问题时,我正试图构建xcFramework。没有什么帮助,但我设法用lipo解决了这个问题,并分享了我的脚本:

OUTPUT_DIR_PATH="${PROJECT_DIR}/XCFramework"

function archivePathSimulator {
    local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-SIMULATOR"
    echo "${DIR}"
}

function archivePathDevice {
    local DIR=${OUTPUT_DIR_PATH}/archives/"${1}-DEVICE"
    echo "${DIR}"
}

function archive {
    echo "▸ Starts archiving the scheme: ${1} for destination: ${2};\n▸ Archive path: ${3}.xcarchive"
    xcodebuild clean archive \
    -project "${PROJECT_NAME}.xcodeproj" \
    -scheme ${1} \
    -configuration ${CONFIGURATION} \
    -destination "${2}" \
    -archivePath "${3}" \
    SKIP_INSTALL=NO \
    OBJROOT="${OBJROOT}/DependentBuilds" \
    BUILD_LIBRARY_FOR_DISTRIBUTION=YES | xcpretty
}

# Builds archive for iOS simulator & device
function buildArchive {
    SCHEME=${1}

    archive $SCHEME "generic/platform=iOS Simulator" $(archivePathSimulator $SCHEME)
    archive $SCHEME "generic/platform=iOS" $(archivePathDevice $SCHEME)
}

# Creates xc framework
function createXCFramework {
    FRAMEWORK_ARCHIVE_PATH_POSTFIX=".xcarchive/Products/Library/Frameworks"
    FRAMEWORK_SIMULATOR_DIR="$(archivePathSimulator $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"
    FRAMEWORK_DEVICE_DIR="$(archivePathDevice $1)${FRAMEWORK_ARCHIVE_PATH_POSTFIX}"

    echo "Removing ${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}"

    if lipo "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}" -verify_arch "arm64"; then
        echo "Removing arm64"
        lipo -remove "arm64" -output "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}" "${FRAMEWORK_SIMULATOR_DIR}/${1}.framework/${1}"
    fi

    xcodebuild -create-xcframework \
               -framework ${FRAMEWORK_SIMULATOR_DIR}/${1}.framework \
               -framework ${FRAMEWORK_DEVICE_DIR}/${1}.framework \
               -output ${OUTPUT_DIR_PATH}/xcframeworks/${1}.xcframework
}

echo "#####################"
echo "▸ Cleaning the dir: ${OUTPUT_DIR_PATH}"
rm -rf $OUTPUT_DIR_PATH

DYNAMIC_FRAMEWORK="${PROJECT_NAME}"

echo "▸ Archive $DYNAMIC_FRAMEWORK"
buildArchive ${DYNAMIC_FRAMEWORK}

echo "▸ Create $DYNAMIC_FRAMEWORK.xcframework"
createXCFramework ${DYNAMIC_FRAMEWORK}

轻松修复

右键单击Applications文件夹中的xcode获取信息选择“使用Rosetta打开”

Run.

Xcode获取信息


在我的情况下,它是100%工作的。试试看:

我有一个临时的解决方案。

您只需按照图像进行操作。

双击架构并选择“其他”和“删除所有行”添加两件事arm7s和arm7在iPhone上运行物理设备,而不是模拟器享受


在我的案例中,错误是由GTMAppAuth引发的,我在Flutter项目中使用的是谷歌签名。

解决方案:您必须转到该包,然后在“仅构建活动体系结构”中单击“是”。


我面临着同样的问题,并试图在M1 Mac上启动React Native应用程序。请注意,我的Intel Mac与相同的项目运行良好,没有此错误。

对我来说,解决问题的是通过Rosetta强制Xcode打开。

要做到这一点:

右键单击Applications文件夹中的Xcode*→ 获取信息→ 选中“使用Rosetta打开”复选框。


我在模拟器/SwiftUI预览中遇到了同样的问题,并出现以下警告:

ld:警告:忽略文件Pods//X.xcframework/ios-arm64_armv7/X.xcframework/X,文件中缺少所需的体系结构x86_64忽略文件Pods//X.xcframework/ios-arm64_armv7/X.xcframework/X(2个切片)

我在项目设置的框架搜索路径中有递归路径$(SRCROOT)。删除它后,项目将在没有错误的情况下生成。


在下图中,在排除的体系结构中→ 在调试和释放中点击+按钮→ 在调试和发布中。


在我们的案例中,这是Jenkins构建中的一个错误:

框架/版本'xxx/Library/Developer/Xcode/DerivedData/xxx cuytrcyjdlfetmavpdonsknoypgk/构建/产品/调试iphoneos/AppsFlyerLib.framework/AppsFryerLib(AFSDKDevice.o),为iOS构建,但在为Mac Catalyst构建的对象文件中链接,文件'xxx/Library/Developer/Xcode/DerivedData/xxx cuytrcyjdlfetmavpdonsknoypgk/Build/Products/Debug-iphoneos/AppsFlyerLib.framework/AppsFlyerLib'用于体系结构arm64

我们用sudo gem更新cocapods修复了它。


在我的案例中,更新CocoaPods有助于:

卸载CocoaPods(如果已安装):sudogem卸载cocoapods安装CocoaPods:酿造装置椰子如果出现链接错误:brew链接--覆盖cocoapods`运行pod安装


转到“目标”部分,选择每个目标并执行以下操作:

将“仅构建活动体系结构”设置为“是”添加排除的体系结构并将其值设置为arm64(见附件)将活动方案(在项目名称旁边的工具栏上)设置为任何iOS模拟器从产品菜单中清除Build文件夹并生成。


所有这些答案中隐藏的宝石

我在主要项目的目标中更改了“排除架构”,但在PODS项目中没有更改。这是一块真正隐藏的宝石。我已经处理这个问题好几个星期了。


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

在切换到Macbook Pro M1 App Silicon后,我也遇到了同样的错误。对我有效的解决方案:

删除Podfile.lock运行pod安装就是这样。


转到finder->应用程序->Xcode->右键单击Xcode->使用rosetta选择打开


Xcode版本13.2.1和macOS Monterey 12.0.1

在切换到新的M1芯片系统后,几乎每个人都面临着与旧项目和吊舱相同的问题。

“在/Users//Desktop/iOS_app/Pods/iOS/framework/(CLSInternalReport.o)中,为iOS模拟器构建,但链接到为iOS构建的对象文件中,用于体系结构的文件'/Users/y/Desktop/_iOS_app/Pods/iOS/.framework/臂64“

我已经找到了一个非常有效的解决方案。

首先,对于所有建议为您的项目排除arm64的开发人员来说,它会工作。是的,它会编译,但在安装后,当您尝试打开它时,它会显示一个弹出窗口,显示消息“此应用程序的开发人员需要更新它才能使用此版本的iOS”。这是因为根据苹果公司的说法,“在iOS 11及更高版本中,所有应用程序都使用64位架构”,如果您将arm64排除在项目之外,则不会在iOS 11或更高版本上打开应用程序。

因此,与其选择整个项目,不如将模拟器的架构排除在arm64之外。

步骤:在项目文件之上,选择目标>构建设置>体系结构>排除的体系结构。现在添加选择“任何iOS模拟器SDK”并给它一个值arm64。

参考见下图。


我不需要建造模拟器。

对我来说,原因是我在顶部栏的iOS模拟器下选择了一个iPad,在那里你可以选择构建目标-选择一个真实的设备或任何iOS设备(arm64,armv7)解决了这个问题。


将此添加到我的pod文件的末尾修复了错误:

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 i386"
    end
  end
end

截至2022年9月19日,所有现有答案都不适用于我。大多数答案建议将arm64从构建设置中排除,完成后,会出现致命错误:找不到模块映射文件

对我有用的是使用Rosseta打开Xcode,

右键单击应用程序文件夹中的Xcode显示简介使用Rosetta检查打开打开Xcode打开的项目清理生成文件夹运行项目

通过使用Rosseta打开Xcode,不需要其他构建设置或配置。

参考文献:

https://medium.com/timeless/starting-react-native-project-in-apple-mac-m1-chip-system-28da0c1f2132https://developer.apple.com/forums/thread/670006


请参阅此技术说明:https://developer.apple.com/documentation/technotes/tn3117-resolving-build-errors-for-apple-silicon排除模拟器的臂64应该是一个临时解决方案。


这是唯一对我有用的东西:

将此添加到调试(非发布)版本:

// Speed up non-production builds by building only for the currently selected architecture
ONLY_ACTIVE_ARCH = YES

// For unknown reasons we need this to be able to compile for simulators in Apple Silicon macOS without Rosetta
VALID_ARCHS = arm64 armv7 arm64-ios-simulator

并删除所有配置(调试和发布)的EXCLUDED_ARCHS设置的所有自定义实例,包括臭名昭著的EXCLUDE D_ARCHS[sdk=iphonesimulator*]=arm64 one。

这些是我在进行这些更改后进行的测试,所有测试都通过了,在原生Apple Silicon上(Xcode没有Rosetta模式):

Debug Staging Release
Build & Run on Device
Build & Run on Simulator
Archive
Validated against App Store Connect N/A N/A

我在框架中看到了很多奇怪的行为,我认为这是因为对模拟器进行了更改,以支持Apple silicon。我的临时解决方法是,在我的应用程序/扩展目标中,在为模拟器构建时,将“arm64”添加到“排除架构”构建设置中(正如您的预览所尝试的那样),并将所有方案的“仅构建活动架构”设置为“否”。也许值得一试。


节省时间的敬礼。

转到->应用程序->Xcode->右键单击Xcode->单击获取信息->使用rosetta选择打开。

请确保它在你的pod文件中,删除它。config.build_settings['ARCHS[sdk=iphonesimulator*]']=uname-m

[]

如果你的问题没有解决,也可以试试这个

从项目目录中删除所有突出显示的文件,并通过“pod安装”重新安装pod。