所以我想尝试使用shopify API . 当我存档应用程序并验证它然后没有问题但是当我将它提交到应用商店时它会给我以下问题 .
-
错误ITMS-90087:"Unsupported Architecture. Your executable contains unsupported architecture '[x86_64, i386]'."
-
错误ITMS-90209:"Invalid segment Alignment. The App Binary at SJAPP.app/Frameworks/Buy.framework/Buy does not have proper segment alignment. Try rebuilding the app with the latest xcode version."(我已经在使用最新版本 . )
-
错误ITMS-90125:"The Binary is invalid. The encryption info in the LC_ENCRYPTION_INFO load command is either missing or invalid, or the binary is already encrypted. This binary does not seem to have been built with Apple's Linker."
-
警告ITMS-90080:"The Executable Payload/..../Buy.framework is not a Position Independent Executable. Please ensure that ur build settings are configured to create PIE executables."
15 回答
我有同样的问题 . 添加给定的运行脚本后,即使它无法正常工作 . 这是Xcode相关的问题 . 我使用的是Xcode版本9.0,但最新版本是9.2 .
所以我安装了最新的Xcode(9.2)并且它有效 .
对我有用的简单解决方案是
完成了!
问题是Buy框架包含模拟器(x86_64)和实际设备(ARM)的构建 .
当然,您不允许向App Store提交不支持的体系结构的二进制文件,因此解决方案是在提交之前“手动”从最终二进制文件中删除不需要的体系结构 .
Daniel Kennett想出了a nice solution and provides this script来添加到构建阶段:
我用过它并且效果很好 .
编辑:确保你看看Varrry发布的修改过的脚本,因为这个有一些小问题 .
由pAkY88给出的Answer,但我在https://stackoverflow.com/a/35240555/5272316遇到了与Mario A Guzman相同的问题:一旦我们切断了未使用的架构,我们每次都可以重新嵌入二进制文件 . 想法是 - 在构建存档时只删除i386和x86_64切片,所以我修改了脚本:
如果不是为模拟器运行(这意味着目标文件夹不像“Debug-iphonesimulator”),这个脚本只是从胖二进制文件(如果存在)中删除i386和x86_64片 .
对不起,我不熟悉shell脚本,所以可能有人可以用更优雅的方式编写它 . 但它有效)
您的框架包含
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
如果您正在使用Carthage,那么您可能会遇到此问题,因为该项目是:
缺少
carthage copy-frameworks
构建阶段 .或者构建阶段不包括所有框架(不完整列表) .
此操作将框架过滤为有效体系结构列表(code) .
设置复制框架构建阶段
来自Carthage building for iOS steps:
我通过从嵌入式二进制文件部分(Xcode目标 - >常规选项卡)中删除框架(优秀的SVProgressHUD)来解决错误ITMS-90080 .
如果您正在使用
Carthage
,请确保您的Embed Frameworks
Build Step
在Carthage
copy-frameworks
之前在一些不寻常的情况下(例如:Lottie-iOS框架):
您可以像往常一样在“链接库”中使用它 .
However 你必须 also 明确地将其添加到"Embed Frameworks"中(即使这看起来毫无意义,因为只有在"Embed Frameworks"时它才能完美地运行),
并将其放在copy-frameworks中
并确保复制框架为 after "Embed Frameworks"
我会在这里加上我的2美分(以不太可怕的方式:-) . 我遇到了很多来自供应商的胖库(出于某种原因)通过将它们添加到Apple记录的
Frameworks
目录中而无法正常工作 . 我们能够使它们工作的唯一方法是将.framekwork
权限拉到项目目录中,并在Build Settings中手动链接Embedded Frameworks
和Link Binary with Libraries
. 这似乎没有任何问题,但是,与任何胖库一样,它们带有无关的模拟器架构i386
和x86_64
以及arm
架构 .检查胖库架构的快速方法是
哪个应该吐出像这样的输出
这确认您需要在iTunesConnect Archival上传之前从您的框架中获取"trim the fat"(即
i386
&x86_64
),这不允许这些体系结构(因为它们不支持iOS) .现在,这里的所有答案(或至少一些答案)都提供了这些精彩的运行脚本,我确信它们运行得非常好,但前提是您的框架位于
Frameworks
目录 . 现在,除非你是一个shell脚本垃圾,那些没有修改的脚本将不适用于我上面解释的场景 . 但是,有一种非常简单的方法可以摆脱框架中的i386
和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
不修改输入文件,它只生成一个文件,因此您必须为x86_64
和i386
运行lipo -remove
一次 . 上面的命令只是通过首先重命名可执行文件然后最终删除所需的arch,然后清理左边的文件来完成 . 就是这样,您现在应该看到Application Loader Archival上传到iTunesConnect的绿色复选标记 .Things to keep in mind :上述步骤只应在 生产环境 构建时完成,因为
.framework
将从模拟器架构中剥离,模拟器上的构建将停止工作(这是预期的) . 在开发环境中,不需要从.framework
文件中删除体系结构,因为您希望能够在模拟器和物理设备上进行测试 . 如果您的胖库位于项目的Frameworks
文件夹中,请查看接受的答案 .即使在添加脚本并更新框架几次后,我也遇到了同样的问题 .
确保在xCode中,在嵌入之后添加脚本 . 我想我在嵌入式框架之前不小心移动了脚本 .
注意:我有xCode 9.1
我从Build Settings - Valid Architectures - Release中删除了架构i386和x64_86,一切正常 .
现在唯一的问题是,您无法在 SIMULATOR 上运行 RELEASE 构建以进行测试 . 但是,就像移除拱门一样容易,如果需要,可以将它们添加回去 .
通过从pAky88的答案稍微修改运行脚本并在嵌入框架后执行,我解决了这个问题 . 另外,请务必取消选中“仅在安装时运行脚本”框 .
使用以下步骤从框架中删除 [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
此错误(ITMS-90240)也可能由静态(.a)库引起 . 下面是一个剥离多余架构的脚本 . 在Xcode中,将其添加到Target> BuildPhases>单击并选择Run Script . 然后将其粘贴到脚本框中 .
该脚本搜索.a文件,检查它是否包含有问题的体系结构,然后检查是否创建了没有该体系结构的新.a文件 .
对于macOS:
对于iOS:
感谢以上所有答案 . 这是使用swift 4.2的脚本