手动签名和压缩的 iOS 应用程序不会上传到 App Store

Posted

技术标签:

【中文标题】手动签名和压缩的 iOS 应用程序不会上传到 App Store【英文标题】:iOS app manually signed and zipped does not upload to App Store 【发布时间】:2015-11-02 13:41:25 【问题描述】:

我这几天一直在苦苦挣扎……

我有一个在 AdHoc 中运行良好的应用程序,现在我正在向客户提供一个 .ipa,以便上传到他们的私人商店。

我正在使用 XCode6.4 和 Swift,并通过 xCode 存档。

在第一次尝试期间,应用程序因客户而崩溃,并显示以下日志:

Library not loaded: @rpath/libswiftCore.dylib
Referenced from:  /private/var/mobile/Containers/Bundle/Application/F223C4F8-4CBA-4474-9809-79D80C5AB11F/appname.app/appname
Reason: no suitable image found.  Did find:
/private/var/mobile/Containers/Bundle/Application/F223C4F8-4CBA-4474-9809-79D80C5AB11F/appname.app/Frameworks/libswiftCore.dylib: code signature invalid for '/private/var/mobile/Containers/Bundle/Application/F223C4F8-4CBA-4474-9809-79D80C5AB11F/appname.app/Frameworks/libswiftCore.dylib'
Dyld Version: 353.12

经过多次尝试解决此问题后,我尝试手动签署应用程序。 解压“somename.ipa”时,我得到一个带有 3 个子文件夹的“somename”文件夹:Payload、SwiftSupport、Symbols。 我跑了: codesign --force --verbose --sign 'iPhone Distribution: certificate' appname.app/

然后: codesign --force --verbose --sign 'iPhone Distribution: certificate' appname.app/Frameworks/*

生成的 CodeResources 文件看起来与以前完全相同。所以我反过来做了——先签署框架,然后签署应用程序。这次我得到了一个 CodeResources 文件,其中框架文件的哈希值不同,其余文件的哈希值与以前相同。

现在,我压缩了“somename”文件夹并将扩展名从“.zip”更改为“.ipa”。请注意,它仍然具有相同的结构。

现在,当客户尝试上传时,他们会得到以下答案: “提交错误:此版本未通过自动验证 致命错误: - 应用程序目录结构应该是 Payload/appname.app/"

.ipa 确实包含该目录,我检查了两倍和三倍,以及(新的)Swift ***目录和符号文件目录。

不知道该去哪里...

【问题讨论】:

【参考方案1】:

我正在使用以下脚本命令以新条款退出申请:

#Pulls the entitlements out of the provision profile
/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i $PROVISION_PATH/$ADHOC_PROVISION) > entitlements.plist

#Remove old CodeSignature
rm -rf Payload/$1.app/_CodeSignature Payload/$1.app/CodeResources

# Replace embedded mobile provisioning profile
cp $PROVISION_PATH/$ADHOC_PROVISION Payload/$1.app/embedded.mobileprovision

# Re-sign
/usr/bin/codesign --verify -f --sign "iphone distribution" --resource-rules=Payload/$1.app/ResourceRules.plist --entitlements entitlements.plist Payload/$1.app

# Re-package
zip -qr $1.adhoc.ipa Payload

在哪里

$1 - 应用程序名称

$PROVISION_PATH/$ADHOC_PROVISION - 新的配置文件

【讨论】:

谢谢!我只想用相同的证书重新签名,所以我认为我不需要更改配置文件 - 你怎么看?另外,从你的最后一行来看,你的应用程序可能是 obj-c 而不是 swift? 嗯,只能用新证书重唱?当您生成配置文件时,您必须设置分发证书。如果您尝试使用其他证书唱歌 - 应该会发生错误。我将此脚本用于 objC 和 Swift 项目。 关于 libswiftCore.dylib 崩溃 - 嵌入式框架可能会帮助您,请查找详细信息here 谢谢。我正在使用相同的证书重新签名。我推断你有 obj-c 只是因为你只压缩了 Payload 文件夹 - swift 项目有另一个文件夹。 您好,您找到解决方案了吗?我有完全相同的问题。我辞职了一个 .ipa(工作正常),但是当我运行该应用程序时,它崩溃了,因为它无法加载 libswiftCore.dylib

以上是关于手动签名和压缩的 iOS 应用程序不会上传到 App Store的主要内容,如果未能解决你的问题,请参考以下文章

ap-south-1区域的AWS SignatureDoesNotMatch错误

无法通过 fastlane 使用 Google Play 应用签名将 android 包上传到 Google Play

由于缺少JAR签名,Android Studio不会让我上传APK

Amazon S3 预签名 URL - 手动或一次性上传无效

上传存档错误:“缺少...的 iOS 分发签名身份”

苹果iOS超级签名不会掉签是啥原理?是不是真的不会掉签?