在 32 位设备上重新签署具有不同权利的 iOS 应用程序失败

Posted

技术标签:

【中文标题】在 32 位设备上重新签署具有不同权利的 iOS 应用程序失败【英文标题】:Re-sign iOS app with different entitlements fails on 32bit devices 【发布时间】:2016-07-04 15:57:33 【问题描述】:

我有一个想法,我想在我们的构建服务器上构建我的应用程序,然后将其分发到多个环境,然后最终登陆 iTunes 商店。

我遇到的一个问题是权利。如果我将$ENVIRONMENT.plist 权利复制到应用程序中,并使用它重新签名,则应用程序将按预期安装并运行在 64 位设备上。我遇到的问题是它不能在 32 位设备 (ARMv7 / ARMv7S) 上运行,并且因为它最初是为 Ad-Hoc (HockeyApp) 构建的,所以它不带有 beta 权利。

所以本质上我对不同的环境有不同的 plist 文件

dev.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>XXXXX.com.mydomain.mobile</string>
    <key>keychain-access-groups</key>
    <array>
        <string>XXXXX.com.mydomain.mobile</string>
    </array>
    <key>get-task-allow</key>
    <false/>
</dict>
</plist>

prod.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>application-identifier</key>
    <string>XXXXX.com.mydomain.mobile</string>
    <key>keychain-access-groups</key>
    <array>
        <string>XXXXX.com.mydomain.mobile</string>
    </array>
    <key>get-task-allow</key>
    <false/>
    <key>beta-reports-active</key>
    <true/>
</dict>
</plist>

然后我在部署期间复制 plist 文件,并尝试重新签名

cp $ENVIRONMENT.plist "$APPFOLDER/Entitlements.plist"
/usr/bin/codesign -f -v -v -s "$CERTIFICATE_NAME" --entitlements="$APPFOLDER/entitlements.plist" "$APPFOLDER/Payload/$APPNAME.app" 
pushd $APPFOLDER 
zip -qr ~/Desktop/Archive/$ENVIRONMENT_NAME/$APPNAME-$APP_VERSION.ipa Payload
popd

当我采用这种方法时,我可以在 iPhone 6+ 上毫无问题地启动该应用程序,但是当我尝试在 iPhone 4S 或 iPhone 5 上启动该应用程序时,我会遇到启动崩溃而没有任何崩溃日志。

为不同环境重新签署具有不同权利的应用的正确方法是什么?同样,崩溃只发生在 32 位设备上,64 位即使在辞职后也能按预期运行。

编辑:

如果我只是使用 Visual Studio 构建应用程序并且不解包/更新/重新签名,那么该应用程序在所有平台上都可以按预期运行。

编辑:

这是我能得到的唯一错误输出。它来自 XCode 设备控制台。

Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S amfid[312] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S securityd[86] <Error>:  secTaskDiagnoseEntitlements MISSING keychain entitlements: no stored taskRef found
Jul  7 11:01:02 Company-iPhone-4S amfid[312] <Error>:  SecTrustEvaluate  [leaf IssuerCommonName SubjectCommonName]
Jul  7 11:01:02 Company-iPhone-4S kernel[0] <Notice>: xpcproxy[359] Container: /private/var/mobile/Containers/Data/Application/877013A4-BF2A-4AC9-8CEA-1598EA2CD336 (sandbox)
Jul  7 11:01:02 Company-iPhone-4S com.apple.xpc.launchd[1] <Error>: assertion failed: 13F69: launchd + 85529 [083E000D-4C31-3B98-A2C4-6FADB4D1940F]: 0x3
Jul  7 11:01:02 Company-iPhone-4S MyCompMyAppMobileios[359] <Warning>: Found new TLS offset at 176
Jul  7 11:01:02 Company-iPhone-4S MyCompMyAppMobileiOS[359] <Warning>: The assembly mscorlib.dll was not found or could not be loaded.
Jul  7 11:01:02 Company-iPhone-4S MyCompMyAppMobileiOS[359] <Warning>: It should have been installed in the `/Users/builder/data/lanes/3412/3cf8aaed/source/maccore/builds/install/target7/lib/mono/2.1/mscorlib.dll' directory.
Jul  7 11:01:02 Company-iPhone-4S com.apple.xpc.launchd[1] (UIKitApplication:com.MyComp.mobile[0x3eca][359]) <Warning>: Service exited with abnormal code: 1
Jul  7 11:01:02 Company-iPhone-4S SpringBoard[48] <Warning>: Application 'UIKitApplication:com.MyComp.mobile[0x3eca]' exited voluntarily.
Jul  7 11:01:03 Company-iPhone-4S kernel[0] <Notice>: xpcproxy[360] Container: /private/var/mobile/Containers/Data/Application/877013A4-BF2A-4AC9-8CEA-1598EA2CD336 (sandbox)
Jul  7 11:01:03 Company-iPhone-4S com.apple.xpc.launchd[1] <Error>: assertion failed: 13F69: launchd + 85529 [083E000D-4C31-3B98-A2C4-6FADB4D1940F]: 0x3
Jul  7 11:01:03 Company-iPhone-4S MyCompMyAppMobileiOS[360] <Warning>: Found new TLS offset at 176
Jul  7 11:01:03 Company-iPhone-4S MyCompMyAppMobileiOS[360] <Warning>: The assembly mscorlib.dll was not found or could not be loaded.
Jul  7 11:01:03 Company-iPhone-4S MyCompMyAppMobileiOS[360] <Warning>: It should have been installed in the `/Users/builder/data/lanes/3412/3cf8aaed/source/maccore/builds/install/target7/lib/mono/2.1/mscorlib.dll' directory.
Jul  7 11:01:03 Company-iPhone-4S com.apple.xpc.launchd[1] (UIKitApplication:com.MyComp.mobile[0xc803][360]) <Warning>: Service exited with abnormal code: 1
Jul  7 11:01:03 Company-iPhone-4S SpringBoard[48] <Warning>: Application 'UIKitApplication:com.MyComp.mobile[0xc803]' exited voluntarily.

注意:我已经重新生成了我的分发配置文件,以便其中包含测试版内容,并且我正在使用 sigh 获取我的配置配置文件的最新副本。 p>

注意:辞职的原因是我有一些 XML 配置,将应用程序指向每个环境(开发、测试、生产)的不同服务器,并且在辞职前得到更新。

【问题讨论】:

嗯...问题可能是您将 $ENVIRONMENT.plist 复制到“$APPFOLDER/Entitlements.plist”(注意大写的权利),但随后您正在与 -- entitlements="$APPFOLDER/entitlements.plist"(注意小写)。 iOS 文件系统区分大小写。但是我认为它在 64 位设备上也会失败,但这似乎值得一提。 @jgoldberger 你知道,我想到了这一点,所以我把那段代码移到了我的部署的 powershell 部分Copy-Item "$here\entitlements\$environment.plist" "$here\$($this.ipaName)\entitlements.plist" 我从 iPhone 6+ 发布时抓取了控制台输出,其中没有任何意义。从 HockeyApp 下载的同一个应用,两个完全不同的输出。 【参考方案1】:

我想澄清一件事:协同签名只是为了创建一个签名来验证 .app 文件中的每个字节都与它的创建者签名时完全相同(由签名身份指定) .所以理论上这应该与应用程序部署在哪个平台上无关。

我还想更清楚地了解您的场景:您是想通过 TestFlight 测试您的应用程序,还是仅通过 HockeyApp 进行临时测试?由于 beta 权利只是通过 TestFlight 进行 beta 测试的要求。它也与您在 32 位平台上的崩溃无关。

那么对于你的问题,我的建议是:

1) 检查您应用的配置,尤其是其目标平台,以验证是否支持 ARMV7;

2) 通过 Xcode 测试您的应用以排除任何其他签名/配置文件问题。这可以验证您的应用在开发模式下是否可以在 64 位和 32 位上正常工作。

3)最后也是最重要的一点,最好附上在部署期间从 Xcode 输出或设备创建的错误日志。这对解决问题有很大帮助。

【讨论】:

该应用程序是用 C# (Xamarin) 编写的。它支持 ARMv7 和 ARM64。我们在 HockeyApp (Ad-Hoc) 中测试“Dev”和“Test”环境,并在公开发布前在 TestFlight 中测试“Production”环境(冒烟测试)。如果codesign 只是按照您所说的进行检查,那么实际重新签名需要什么命令?最好的部分是没有崩溃负载(正如我之前所说)。我也进行了编辑。 1. codesign 是创建一个签名,它是进行重新签名的正确工具。 2. 你能从崩溃的 iphone 设备中获取任何日志吗? 3.如果通过 HockeyApp 分发,你有同样的问题吗?我问这是因为即使是临时分发,我们仍然需要在上传到 HA 之前进行代码设计。 我已将我从 XCode 中得到的错误消息添加到原始问题中。 这似乎是 Apple iOS 问题,而不是代码签名问题。你可以在这里找到类似的错误报告:forums.developer.apple.com/thread/20193。根据此线程中的讨论,我想这可能与记忆压力有关:forums.developer.apple.com/thread/4743? 谢谢。是的,我找到了那个线程并正在调查它。我遇到的问题是我可以在重新签名之前让应用程序在旧设备上运行:( - 很困惑。

以上是关于在 32 位设备上重新签署具有不同权利的 iOS 应用程序失败的主要内容,如果未能解决你的问题,请参考以下文章

为 iOS 9 重新签署 IPA

在 64 位 iOS 设备上更改唯一标识符

我们可以使用我们的开发证书重新签署应用商店构建吗?

不同的 .NET 程序集引用取决于 32-64 位 [重复]

“NSString stringWithFormat:”在 32 位设备中具有“%zd”奇怪行为

sprintf在具有中断的32位MCU中重新进入64位操作