我无法再在模拟器上运行我的应用。在线建议我编辑我的project.pbxproj,但这似乎不起作用。如何回收在模拟器上运行项目的能力(并保持在设备上运行的能力)?我正在使用另一个使用许多相同框架的项目,但是它在模拟器上运行。是什么会导致类似的框架在一个项目中起作用而在另一个项目中不起作用?
答案 0 :(得分:95)
答案 1 :(得分:15)
使用 .xcframework 而不是包含 iOS 和 iOS 模拟器切片的“胖”.framework。 这也避免了在为 App Store 构建时使用构建阶段来剥离 iOS 模拟器切片的需要。
不支持通常使用 lipo 创建的“Fat”框架,因为它们不能由 Xcode 直接构建(source: Developer Technical Support Apple Developer forum)。 .xcframework 是唯一支持的机制,可以发布同时支持 iOS 和 iOS 模拟器的单个框架。
此外,.xframework 是唯一支持的二进制 Swift 框架 (source: Developer Technical Support on Apple Developer forum)。
在 Xcode 12.3 中,强制执行不支持“胖”框架的事实,因为 Xcode 在构建期间验证框架,这就是为什么许多项目突然开始看到构建错误。
答案 2 :(得分:14)
答案 3 :(得分:10)
在这里,大部分的回答是消费者普遍的二进制文件,以解决新的限制。但是,正如其他地方所述,是时候为框架作者迁移到 Apple 的 XCFramework
格式了。
如果你正在运行一个自定义生成脚本之前创建通用二进制与总目标和lipo
,这是简单的移植到生产.xcframework
文件
首先,在生成设置确保 “的配建库”(BUILD_LIBRARY_FOR_DISTRIBUTION
)设置为YES
然后,用于替换现有的总目标构建脚本lipo
喜欢的东西是简单的展示如何让下面的“释放”框架只:
# Universal Script
set -e
FRAMEWORK_NAME="your_framework_name"
IOS_SCHEME_NAME="your_scheme_name"
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
SIMULATOR_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphonesimulator.xcarchive"
DEVICE_ARCHIVE_PATH="${SRCROOT}/build/${FRAMEWORK_NAME}-iphoneos.xcarchive"
OUTPUT_DIR="${SRCROOT}/framework_out_universal/"
# Simulator xcarchieve
xcodebuild archive \
-scheme ${IOS_SCHEME_NAME} \
-archivePath ${SIMULATOR_ARCHIVE_PATH} \
-configuration Release \
-sdk iphonesimulator \
SKIP_INSTALL=NO
# Device xcarchieve
xcodebuild archive \
-scheme ${IOS_SCHEME_NAME} \
-archivePath ${DEVICE_ARCHIVE_PATH} \
-sdk iphoneos \
-configuration Release \
SKIP_INSTALL=NO
# Clean up old output directory
rm -rf "${OUTPUT_DIR}"
# Create xcframwork combine of all frameworks
xcodebuild -create-xcframework \
-framework ${SIMULATOR_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
-framework ${DEVICE_ARCHIVE_PATH}/Products/Library/Frameworks/${FRAMEWORK_NAME}.framework \
-output ${OUTPUT_DIR}/${FRAMEWORK_NAME}.xcframework
# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
您可以调整上述有不同的输出显示目录,不同的删除行为,支持多种配置(发布版vs调试),但是这对我的作品。
最后,作为一个时间步,删除your_framework_name.framework
普遍引起你的错误,如这个项目提二进制。复制新建your_framework_name.xcframework
并把它添加到项目和错误应该消失。
答案 4 :(得分:5)
可能的原因是
答案 5 :(得分:3)
对于XCODE 12.3最新版本-如果您遇到此问题-
这是一个解决方法
在“构建设置”下-导航至“验证工作区”-将其更改为“是”(默认为“否”)
答案 6 :(得分:3)
Xcode 12.3 充满了问题。 您的选择是:
答案 7 :(得分:0)
我想您要链接的框架仅针对arm体系结构构建。您将无法在模拟器中运行它。您将需要框架的作者来构建“通用框架”。
答案 8 :(得分:0)
我需要删除框架,然后再次添加它,它也嵌入了它-以前没有。
答案 9 :(得分:0)
毫无疑问,在Xcode 12.3的情况下,解决方法是在目标的构建设置中设置Validate Workspace属性。但是,如果在此更改后检查差异,则生成错误的原因是项目文件中缺少参数(VALIDATE_WORKSPACE),而不是参数值。 因此,您不需要将该值设置为是。您需要将该值添加到项目设置中,并且可以将其保留为默认值(NO)。第一次,它以“否”出现在“构建设置”中,但这仅是因为这是缺少参数的默认值。
TLDR; 不更改项目设置,转到目标的构建设置,找到“验证工作区” ,将其设置为“是”,然后将其设置回“否”
答案 10 :(得分:0)
老实说,你们应该遵循的唯一方法是将 .framework 转换为 .xcframework,因为这是 Apple 从 XCode 12.3 及更高版本开始强制执行的。验证工作区和其他快速修复可能是暂时的,并在未来导致问题 - 例如存档应用以供应用商店发布或测试飞行。
要将 .framework 转换为 .xcframework,请按照文章中描述的步骤操作,从段落命令开始: https://medium.com/strava-engineering/convert-a-universal-fat-framework-to-an-xcframework-39e33b7bd861
答案 11 :(得分:0)
如果您使用 Carthage,请确保您使用 copy-frameworks
脚本而不是使用 Embed & Sign
作为嵌入内容。我遇到了同样的错误,因为我忘记了这一点。
答案 12 :(得分:-1)
我在 Xcode v12.3 和 Universal(fat) Framework
(.framework)
Building for iOS Simulator, but the linked and embedded framework was built for iOS + iOS Simulator.
解决方案 1:是 Toggle/Toggle Validate Workspace
(非默认)
解决方案 2:使用 XCFramework[About]
答案 13 :(得分:-5)
如果您是 Xcode 的新手并且使用 Xcode 只是为了启动模拟器来运行 appium
工具,上述步骤可能很复杂。初学者只需使用低于 11 的 xcode
版本。
此链接有助于下载xcode 10.3
如果您尝试从 AppStore 下载,我们需要最多 40 GB 的免费存储空间,上述 `xip 文件不会导致存储错误。
如果有效,你可以稍后感谢我!!