所以我想尝试使用shopify API。当我存档应用程序并验证它然后没有问题但是当我将它提交到应用商店时它会给我以下问题。
答案 0 :(得分:355)
问题是Buy框架包含模拟器(x86_64)和实际设备(ARM)的构建。
当然,您不能向App Store提交不支持的体系结构的二进制文件,因此解决方案是在提交之前“手动”从最终的二进制文件中删除不需要的体系结构。
Daniel Kennett想出了a nice solution and provides this script来添加到构建阶段:
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
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 "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
我用它并且效果很好。
编辑:确保你看看Varrry发布的修改过的脚本,因为这个脚本有一些小问题。
答案 1 :(得分:128)
Answer有效,但我在https://stackoverflow.com/a/35240555/5272316遇到了与Mario A Guzman相同的问题:一旦我们切断了未使用的架构,我们就不能再运行脚本了删除不存在的切片,因为xcode每次都不会重新嵌入二进制文件。 想法是 - 在构建存档时删除i386和x86_64切片,所以我修改了脚本:
set
如果不是为了模拟器运行(这意味着目标文件夹不像" Debug-iphonesimulator"),这个脚本只是从胖二进制文件(如果存在)中删除i386和x86_64片段。
抱歉,我不熟悉shell脚本,所以可能有人可以用更优雅的方式编写它。但它有效)
答案 2 :(得分:85)
如果您使用的是Carthage,那么您可能会遇到此问题,因为项目是:
carthage copy-frameworks
构建阶段。此操作会将框架过滤为有效体系结构列表(code)。
来自Carthage building for iOS steps:
在应用程序目标的“构建阶段”设置选项卡上,单击 “+”图标并选择“新运行脚本阶段”。在中创建运行脚本 你指定你的shell(例如:bin / sh),添加以下内容 到shell下面的脚本区域:
/usr/local/bin/carthage copy-frameworks
并在“输入文件”下添加要使用的框架的路径,例如:
$(SRCROOT)/Carthage/Build/iOS/Box.framework
$(SRCROOT)/Carthage/Build/iOS/Result.framework
$(SRCROOT)/Carthage/Build/iOS/ReactiveCocoa.framework
此脚本适用于由通用触发的App Store提交错误 二进制文件并确保必要的bitcode相关文件和dSYM 存档时会被复制。
答案 3 :(得分:38)
答案 4 :(得分:30)
如果您使用Carthage
,请确保Embed Frameworks
Build Step
位于Carthage
copy-frameworks
在一些不寻常的情况下(例如:Lottie-iOS框架):
您可以像往常一样在“链接库”中使用它。
然而你必须也在“嵌入框架”中明确添加它(即使这看起来毫无意义,因为当你只有“嵌入框架”),
和将其放入copy-frameworks
和确保复制框架 <嵌入框架后
答案 5 :(得分:11)
我会在这里加上我的2美分(以不太可怕的方式:-)。我遇到了很多来自供应商的胖库(出于某种原因),通过将它们添加到Apple记录的Frameworks
目录中而不能正常工作。我们能够使它们工作的唯一方法是将.framekwork
权限拉到项目目录中,并在Build Settings中手动链接Embedded Frameworks
和Link Binary with Libraries
。这似乎没有任何问题,但是,与任何胖库一样,它们带有无关的模拟器架构i386
和x86_64
以及arm
架构。
检查胖库架构的快速方法是
$ cd 'Project_dir/Project'
$ lipo -info 'YourLibrary.framework/YourLibExec`
哪个应该吐出像这样的输出
Architectures in the fat file: YourLibrary.framework/YourLibExec are: i386 x86_64 armv7 arm64
这证实你需要修剪脂肪&#34; (即i386
&amp; x86_64
)来自iTunesConnect Archival上传之前的框架,它不允许这些架构(因为它们不支持iOS)。
现在,所有答案(或至少一些答案)都提供了这些精彩的运行脚本,我确信它们确实很有效,但前提是您的Framework位于Frameworks
目录中。现在除非你是一个shell脚本junkie,那些没有修改的脚本,对我上面解释的场景不起作用。但是,摆脱i386
&amp;来自框架的x86_64
架构。
将目录直接更改为.framekwork
,如
cd YourProjectDir/YourProject/YourLibrary.framework
运行如下所示的一系列命令 -
$ mv YourLibrary YourLibrary_all_archs
$ lipo -remove x86_64 YourLibrary_all_archs -o YourLibrary_some_archs
$ lipo -remove i386 YourLibrary_some_archs -o YourLibrary
$ rm YourLibrary_all_archs YourLibrary_some_archs
这里需要注意的一些事项 - lipo -remove
必须为每个要删除的体系结构完成一次。 lipo
不修改输入文件,它只生成一个文件,因此您必须为lipo -remove
和x86_64
运行一次i386
。上面的命令只是通过首先重命名可执行文件然后最终删除所需的arch,然后清理左边的文件来完成。就是这样,您现在应该看到Application Loader Archival上传到iTunesConnect的绿色复选标记。
要记住的事情:上述步骤只应在生产构建时完成,因为.framework
将从模拟器架构中剥离,模拟器上的构建将停止工作(是期待)。在开发环境中,不需要从.framework
文件中删除体系结构,因为您希望能够在模拟器和物理设备上进行测试。如果您的胖库位于项目的Frameworks
文件夹中,请查看接受的答案。
答案 6 :(得分:8)
答案 7 :(得分:7)
使用以下步骤从框架中删除 [x86_64,i386] 。 [x86_64,i386] 用于模拟器。
打开Terminal
打开各个框架到终端的项目拖动路径
示例:cd /Users/MAC/Desktop/MyProject/Alamofire.framework
在以下命令中设置您的框架名称并运行
lipo -remove i386 Alamofire -o Alamofire && lipo -remove x86_64 Alamofire -o Alamofire
答案 8 :(得分:3)
答案 9 :(得分:3)
通过从pAky88的答案稍微修改运行脚本并在嵌入框架后执行,我解决了这个问题。另外,请务必取消选中“仅在安装时运行脚本”框。
/usr/local/bin/carthage copy-frameworks
#!/usr/bin/env bash
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
# This script loops through the frameworks embedded in the application and
# removes unused architectures.
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"
if [ ! -f "${FRAMEWORK_EXECUTABLE_PATH}" ]; then
continue
fi
if xcrun lipo -info "${FRAMEWORK_EXECUTABLE_PATH}" | grep --silent "Non-fat"; then
echo "Framework non-fat, skipping: $FRAMEWORK_EXECUTABLE_NAME"
continue
fi
echo "Thinning framework $FRAMEWORK_EXECUTABLE_NAME"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
xcrun lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
xcrun lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
答案 10 :(得分:2)
我删除了i386和i的架构。来自构建设置的x64_86 - 有效的架构 - 发布,一切正常。
现在唯一的问题是,您无法在 SIMULATOR 上运行 RELEASE 构建以进行测试。但是,就像移除拱门一样容易,如果需要,可以将它们添加回去。
答案 11 :(得分:2)
最适合我的解决方案是
1-从嵌入式框架中删除该框架。
2-将框架添加为链接框架
完成!
答案 12 :(得分:1)
我有同样的问题。 添加给定的运行脚本后,即使它无法正常工作。 这是Xcode相关的问题。 我使用的是Xcode 9.0版,但最新版本是9.2。
所以我安装了最新的Xcode(9.2)并且运行良好。
答案 13 :(得分:1)
感谢上述所有答案。这是使用Swift 4.2的脚本
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
FRAMEWORK_NAME="Your_Framework_Name.framework"
# Check if Framework is present.
FRAMEWORK_LOCATION=$(find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d)
if [ -z $FRAMEWORK_LOCATION ]; then
echo "Couldn't find Your_Framework_Name.framework in $APP_PATH. Make sure 'Embed Frameworks' build phase is listed before the 'Strip Unused Architectures' build phase."
exit 1
fi
# This script strips unused architectures
find "$APP_PATH" -name "$FRAMEWORK_NAME" -type d | while read -r FRAMEWORK
do
FRAMEWORK_EXECUTABLE_NAME=$(defaults read "$FRAMEWORK/Info.plist" CFBundleExecutable)
FRAMEWORK_EXECUTABLE_PATH="$FRAMEWORK/$FRAMEWORK_EXECUTABLE_NAME"
echo "Executable is $FRAMEWORK_EXECUTABLE_PATH"
EXTRACTED_ARCHS=()
for ARCH in $ARCHS
do
echo "Extracting $ARCH from $FRAMEWORK_EXECUTABLE_NAME"
lipo -extract "$ARCH" "$FRAMEWORK_EXECUTABLE_PATH" -o "$FRAMEWORK_EXECUTABLE_PATH-$ARCH"
EXTRACTED_ARCHS+=("$FRAMEWORK_EXECUTABLE_PATH-$ARCH")
done
echo "Merging extracted architectures: ${ARCHS}"
lipo -o "$FRAMEWORK_EXECUTABLE_PATH-merged" -create "${EXTRACTED_ARCHS[@]}"
rm "${EXTRACTED_ARCHS[@]}"
echo "Replacing original executable with thinned version"
rm "$FRAMEWORK_EXECUTABLE_PATH"
mv "$FRAMEWORK_EXECUTABLE_PATH-merged" "$FRAMEWORK_EXECUTABLE_PATH"
done
答案 14 :(得分:1)
此错误(ITMS-90240)也可能由静态(.a)库引起。下面是一个剥离多余架构的脚本。在Xcode中将此添加到Target&gt; BuildPhases&gt;单击+并选择“运行脚本”。然后将其粘贴到脚本框中。
脚本搜索.a文件,检查它是否包含有问题的体系结构,如果它确实生成了没有该体系结构的新.a文件。
对于macOS:
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="armv7 armv7s arm64"
for t in $STRIPARCHS
do
if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi
done
exit 0
对于iOS:
APP_PATH="${TARGET_BUILD_DIR}/${WRAPPER_NAME}"
STRIPARCHS="x86_64 i386"
for t in $STRIPARCHS
do
if find "$APP_PATH" -name '*.a' -exec lipo -info {} \; | grep $t ; then
find "$APP_PATH" -name '*.a' -exec lipo -remove $t {} -output {}2 \; -exec rm {} \; -exec mv {}2 {} \; ;
fi
done
exit 0
答案 15 :(得分:0)
您的框架包含ARM
和x86
代码,允许您在设备或模拟器中使用它。如果您打算将应用程序提交到App Store,请运行以下脚本以从二进制文件中删除非活动代码。
1.在Project Navigator中选择目标,然后单击项目编辑器顶部的Build Phases。
2.从Editor菜单中,选择Add Build Phase,然后选择Add Run Script Build Phase(或单击Build Phases编辑器左上角的+按钮)。
3.展开刚刚添加的新Run Script构建阶段旁边的显示三角形。在脚本编辑器框中,粘贴以下内容: bash
$ {BUILT_PRODUCTS_DIR} / $ {FRAMEWORKS_FOLDER_PATH} /的&#34; YourframeworkName.framework&#34; 强> /strip-frameworks.sh
答案 16 :(得分:0)