将iOS应用程序从分发标识重新签名为开发者标识

时间:2013-11-28 14:03:54

标签: ios instruments code-signing provisioning-profile

我使用持续集成工具,使用分发标识和Ad Hoc移动设备构建应用。此应用程序在网站上发送以进行临时部署,一切正常。

但是现在我想在构建工作流程中添加一个步骤来执行UI自动化测试。 Instruments需要一个使用开发人员身份签名的应用程序,因此我不想构建使用开发人员证书签名的应用程序的新版本,而是希望/需要(Q.A.团队实际上想要)使用开发人员证书重新签名之前创建的.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有关。

如果应用程序直接使用Developer身份构建,它运行良好,所以我想在签名阶段失败了。我还在resigned app上做了一个codeign -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 Developer”的证书,但我没有找到更多相关信息。

2 个答案:

答案 0 :(得分:3)

如果您想调整原始权利,可以执行此操作。

获取原始分发权利:

/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

P.S。无需删除_CodeSignature,codesign -f将替换它。

答案 1 :(得分:1)

我终于找到了问题,当在构建期间使用开发者身份时,Xcode嵌入了包含get-task-allow =&gt;的Entitlements.plist文件。是的,当身份是分发时,此get-task-allow设置为false。当“分发”应用程序被“辞职”时,我没有将--entitlements选项传递给codesign,因此该应用程序仍然不是一个有效的“开发者”应用程序。

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

它现在有效,我希望Xcode添加到Entitlements文件中的其他键不会错过(因为我在我的codesign命令调用中使用的那个只包含get-task-allow键)。 / p>