将iOS应用程序从分发标识改为开发人员标识

将iOS应用程序从分发标识改为开发人员标识,ios,instruments,code-signing,provisioning-profile,Ios,Instruments,Code Signing,Provisioning Profile,我使用一个持续集成工具,使用分发标识和临时移动设备构建应用程序。这个应用程序被发送到一个网站上进行临时部署,一切正常 但现在我想在构建工作流中添加一个步骤来执行UI自动化测试。Instruments需要一个使用开发者身份签名的应用程序,因此我不想构建一个使用开发者证书签名的应用程序的新版本,而是希望/需要(Q.a.团队实际上希望)放弃先前创建的带有开发者证书的.ipa。我使用以下命令退出应用程序: unzip "App.ipa" rm -rf "Payload/App.app/_CodeSign

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

但现在我想在构建工作流中添加一个步骤来执行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”(我尝试使用organizer进行安装,但它不会改变任何内容),最后我执行了如下工具:

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有关

如果应用程序是直接用开发者身份构建的,那么它工作得很好,所以我猜在签名阶段有些东西失败了。我还在这个应用程序上做了一个代码设计-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\u ALLOCATE”变量,我尝试了一下,但没有获得更多的成功


PS:我在某个地方读到了关于“iOS开发者”的文章,它本可以取代证书标题中的“iPhone开发者”,但我没有找到更多关于它的信息。

我最终发现了问题,当在构建过程中使用开发者身份时,Xcode嵌入了一个包含get task allow=>true的authentications.plist文件,当标识为distribution时,此get task allow设置为false。当“分发”应用程序“辞职”时,我没有向codesign传递--Authentications选项,因此该应用程序仍然不是有效的仪器“开发者”应用程序

在我的项目中添加一个authorights.plist文件,将get task allow设置为true,并在我的分发配置中引用它,解决了这个问题。现在,当应用程序生成时,它包含get task allow=>true,当它退出时,我将这个相同的authorights.plist传递给codesign选项


目前它还可以工作,我希望Xcode添加到授权文件中的其他键不会丢失(因为我在代码设计命令调用中使用的键只包含get task allow键)。

如果您想修改原始授权,可以这样做

获取原始分发权限:

/usr/libexec/PlistBuddy -x -c "print :Entitlements " /dev/stdin <<< $(security cms -D -i production.app/embedded.mobileprovision) > entitlements.plist
并更新可能不同的任何其他权利,例如推送通知

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

p、 无需删除_codesign,
codesign-f
将为您替换它。

非常感谢您提供这些信息。但是现在我不知道我的答案是正确的还是你的,因为它们都是答案的一部分^^谢谢你的解决方案!我在兜圈子,试图弄明白为什么仪器公司警告我,我的应用程序需要用开发身份签名,而所有人都同意它是。我必须更新我的辞职脚本,以便在作为开发版本进行签名时将get task allow设置为true。这个authorigents.plist文件位于何处?我如何编辑它?Xcode会为您创建它(在编译期间),除非您自己创建它并将其添加到Xcode项目中。我知道Xcode会创建它,但它在何处创建?,我的意思是在哪里可以找到它?在Xcode中,查看构建消息,有很多“编译”行,最后应该有两个ProcessProductPackaging,一个用于.mobileprovision文件,第二个用于权限。如果您打开日志的详细信息,您将拥有权限文件的完整路径(顺便说一句,xcode对权限使用.xcent扩展名)。我想您最终决定了!
/usr/libexec/PlistBuddy -c'Set :aps-environment development' entitlements.plist