【问题标题】:Resign iOS App from a distribution identity to a developer identity将 iOS 应用程序从分发身份辞职为开发人员身份
【发布时间】:2013-11-28 14:03:53
【问题描述】:

我使用了一个持续集成工具,该工具使用分发身份和 Ad Hoc 移动配置来构建应用程序。此应用程序在网站上发送以进行临时部署,并且一切正常。

但现在我想在我的构建工作流程中添加一个步骤来执行 UI 自动化测试。 Instruments 需要一个使用开发人员身份签名的应用程序,因此我希望/需要(实际上是 QA 团队想要)使用开发人员证书对先前创建的 .ipa 进行签名,而不是构建使用开发人员证书签名的应用程序的新版本。我使用以下命令退出应用程序:

unzip "App.ipa"
rm -rf "Payload/App.app/_CodeSignature" "Payload/App.app/CodeResources"
cp "Dev.mobileprovision" "Payload/App.app/embedded.mobileprovision"
/usr/bin/codesign -f -s "iPhone Developer: john doe" --resource-rules "Payload/App.app/ResourceRules.plist" "Payload/App.app"

然后我使用fruitstrap安装“Payload/App.app”(我尝试使用管理器安装它并没有改变任何东西),最后我像这样执行仪器:

instruments -w 5f9...3fd -t /Applications/Xcode.app/Contents/Applications/Instruments.app/Contents/PlugIns/AutomationInstrument.bundle/Contents/Resources/Automation.tracetemplate "App" -e UIASCRIPT /Users/../automation-tests-scripts/test-instruments.js -e UIARESULTSPATH /Users/../test-reports/

仪器因以下错误而失败:

2013-11-28 14:32:56.679 instruments[68408:1007] Permission to debug com.company.App was denied.  The app must be signed with a development identity (e.g. iOS Developer).
2013-11-28 14:32:56.681 instruments[68408:1007] Recording cancelled : At least one target failed to launch; aborting run
Instruments Trace Error : Error Domain=com.apple.instruments Code=1 "Error Starting Recording" UserInfo=0x7fb15b290560 {NSLocalizedDescription=Error Starting Recording, NSLocalizedRecoverySuggestion=At least one target failed to launch; aborting run}
Instruments Trace Error : Failed to start trace.

这些命令适用于在 iOS 6.x 上运行的 iOS 设备,但仅在 iOS 7.x 上因上一个错误而失败(我尝试了 2 个 iOS 6.x 设备、iPhone 4S 和 5,我还尝试了 4 个正在运行的设备iOS 7.x)。所以这个问题与iOS 7有关。

如果应用程序是直接使用开发人员身份构建的,它运行良好,所以我猜在签名阶段有些事情失败了。我还在辞职的应用程序上做了一个 codesign -d -vvv,它显示了这个输出

Executable=/Users/.../App.app/App Identifier=com.company.App
Format=bundle with Mach-O universal (armv7 armv7s) 
CodeDirectory v=20100 size=8547 flags=0x0(none) hashes=420+3 location=embedded 
Hash type=sha1 size=20 CDHash=f00fac8eabf174e88042f2b875505a6cacdd6b0a
Signature size=4326 
Authority=iPhone Developer: john doe (BXX559V2VW)
Authority=Apple Worldwide Developer Relations Certification Authority
Authority=Apple Root CA 
Signed Time=28 nov. 2013 11:56:04
Info.plist entries=27
Sealed Resources version=2 rules=5 files=290
Internal requirements count=2 size=708

我查看了 Xcode 签名过程,它导出了一个“CODESIGN_ALLOCATE”变量,我试过了,但没有取得更大的成功。

PS:我在某处读到了有关“iOS 开发者”的信息,它可能会取代证书标题中的“iPhone 开发者”,但我没有找到有关此的更多信息。

【问题讨论】:

    标签: ios instruments code-signing provisioning-profile


    【解决方案1】:

    如果您想调整您的原始权利,您可以这样做。

    获取原始分发权利:

    /usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i production.app/embedded.mobileprovision) > entitlements.plist
    

    使用

    将它们转化为开发权利
    /usr/libexec/PlistBuddy -c 'Set :get-task-allow true' entitlements.plist
    

    并更新任何其他可能不同的权利,例如推送通知

    /usr/libexec/PlistBuddy -c'Set :aps-environment development' entitlements.plist
    

    附言无需删除 _CodeSignature,codesign -f 将为您替换它。

    【讨论】:

    • 感谢您提供这些信息。但是现在我不知道我应该将我的答案标记为正确还是您的答案,因为它们都是答案的一部分^^
    • 感谢您的解决方案!我一直在兜圈子,试图弄清楚为什么 Instruments 会警告我,当一切都同意时,我的应用程序需要使用开发身份进行签名。在作为开发版本签名时,我必须更新我的辞职脚本以将 get-task-allow 设置为 true。
    【解决方案2】:

    我终于找到了问题,当在构建过程中使用开发者身份时,Xcode嵌入了一个包含get-task-allow => true的Entitlements.plist文件,当身份是分发时,这个get-task-allow设置为假。当“分发”应用程序被“辞职”时,我没有将 --entitlements 选项传递给代码设计,因此该应用程序仍然不是仪器的有效“开发人员”应用程序。

    在我的项目中添加一个 get-task-allow 设置为 true 的 Entitlements.plist 文件并在我的 Distribution 配置中引用它解决了这个问题,现在当构建应用程序时它包含 get-task-allow => true,当它辞职时,我将同样的 Entitlements.plist 传递给 codesign 选项。

    它现在有效,我希望 Xcode 添加到权利文件的其他键不会丢失(因为我在我的 codesign 命令调用中使用的键只包含 get-task-allow 键)。

    【讨论】:

    • 这个 entitlements.plist 文件在哪里?我该如何编辑它?
    • Xcode 为您创建它(在编译期间),除非您自己创建它并将其添加到您的 xcode 项目中
    • 我知道 Xcode 会创建它,但它在哪里创建?我的意思是我在哪里找到它?
    • 在 Xcode 中查看构建消息,有很多“编译”行,最后应该有 2 个 ProcessProductPackaging,一个用于 .mobileprovision 文件,第二个用于权利。如果您打开日志的详细信息,您将获得授权文件的完整路径(顺便说一下,xcode 使用 .xcent 扩展名作为授权)。
    • 我猜你终于决定了!
    猜你喜欢
    • 2014-12-05
    • 2017-05-01
    • 2017-06-02
    • 2015-04-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2018-12-08
    相关资源
    最近更新 更多