如何为已链接框架补充缺失架构?SpotifyiOS.framework集成报错求助
嘿,这个问题我之前帮朋友解决过,其实就是Spotify的通用框架同时包含真机和模拟器架构,和Xcode的构建规则冲突导致的,给你几个可行的方案,从手动处理到自动脚本再到最省心的集成方式,你挑适合自己的来:
方案1:手动剥离模拟器架构(适合手动集成框架的情况)
SpotifyiOS.framework是个通用框架——它同时包含了arm64/armv7(真机)和x86_64/i386(模拟器)的架构,Xcode不允许在构建真机包时嵌入带模拟器架构的框架,而不嵌入又会因为架构匹配问题报错。咱们先手动处理掉模拟器架构:
- 打开终端,cd到你存放SpotifyiOS.framework的目录
- 先确认框架包含的架构,执行命令:
你会看到类似lipo -info SpotifyiOS.framework/SpotifyiOSArchitectures in the fat file: SpotifyiOS are: armv7 arm64 i386 x86_64的输出 - 剥离模拟器架构,只保留真机架构:
lipo SpotifyiOS.framework/SpotifyiOS -remove x86_64 -remove i386 -output SpotifyiOS.framework/SpotifyiOS - 回到Xcode,把框架的Embed设置改回Embedded & Sign,重新构建真机目标,这时候应该就能正常编译了。
- 注意:如果之后要在模拟器上调试,你得保留一个未剥离的框架版本,切换时替换就行,嫌麻烦的话可以看下面的自动脚本方案。
方案2:添加Xcode构建脚本自动处理架构(高效不折腾)
为了不用每次切换真机/模拟器都手动替换框架,咱们给Xcode加个自动处理的脚本:
- 选中你的项目target,进入Build Phases选项卡
- 点击左上角的「+」号,选择New Run Script Phase
- 把下面的脚本粘贴进去,记得把脚本拖到Embed Frameworks阶段的后面(顺序很重要):
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}" # 遍历所有嵌入的框架,处理架构 find "$APP_PATH" -name '*.framework' -type d | while read -r FRAMEWORK do FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable) FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME" echo "处理框架: $FRAMEWORK_EXECUTABLE_PATH" # 提取当前构建需要的架构 EXTRACTED_ARCHS=() for ARCH in $ARCHS do echo "提取架构: $ARCH" lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH" EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH") done # 合并提取的架构 echo "合并架构: ${EXTRACTED_ARCHS[@]}" lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}" rm "${EXTRACTED_ARCHS[@]}" # 替换原可执行文件 rm "$FRAMEWORK_EXECUTABLE_PATH" mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH" done - 现在不管你是构建真机还是模拟器,Xcode都会自动剥离掉不需要的架构,再也不用手动替换了。
方案3:改用CocoaPods集成(最省心的方式)
如果你的项目已经在用CocoaPods,直接用它来集成Spotify SDK是最省事的,它会自动处理所有架构和嵌入的问题:
- 打开Podfile,添加一行:
pod 'SpotifyiOS' - 执行
pod install,然后打开.xcworkspace文件,直接构建就行,啥报错都不会有。
另外,顺便检查下你的项目架构设置,确保没问题:
- 选中target,进入Build Settings,搜索Architectures
- 确保Architectures设置为
Standard Architectures (arm64, armv7)(如果支持iOS 11以下)或者只保留arm64(只支持iOS 11+) - Build Active Architecture Only在Debug模式设为
Yes,Release模式设为No
内容的提问来源于stack exchange,提问作者Tochukwu
相关产品推荐
相关产品推荐

