2013-11-28 60 views
3

我使用持續集成工具,該工具使用分發標識和Ad Hoc移動設置構建應用程序。這個應用程序發送到一個網站進行臨時部署,一切正常。將iOS應用程序從分發標識移至開發人員標識

但是現在我想在構建工作流程中添加一個步驟來執行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安裝「有效載荷/ 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,並且我嘗試了使用運行iOS 7.x的4個設備)。所以這個問題與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_ALLOCATE」變量,我試過了,我並沒有獲得更多的成功。 PS:我讀了一些關於「iOS開發者」的地方,它可能已經取代了證書標題中的「iPhone開發者」,但是我沒有找到關於這方面的更多信息。

回答

1

我終於發現了這個問題,當在構建過程中使用開發人員身份時,Xcode嵌入一個Entitlements.plist文件,該文件包含get-task-allow => true,當身份爲分佈時,此get-task- allow設置爲false。當「發行」應用程序「被辭職」時,我沒有將--entitlements選項傳遞給codesign,因此該應用程序仍然不是適用於樂器的有效「開發者」應用程序。

添加一個Entitlements.plist文件,並在我的項目中將get-task-allow設置爲true,並在我的Distribution配置中引用它解決了問題,現在構建應用程序時,它包含get-task-allow => true ,當它辭職時,我將這個相同的Entitlements.plist傳遞給codesign選項。

它現在可以工作了,我希望Xcode添加到Entitlements文件中的其他鍵不會丟失(因爲我在我的codesign命令調用中使用的鍵只包含get-task-allow鍵)。

+0

這個entitlements.plist文件位於哪裏?我怎麼編輯它? –

+0

Xcode爲你創建它(在編譯期間),除非你自己創建它並將它添加到你的xcode項目 – LiohAu

+0

我得到了Xcode將創建它,但它創建它在哪裏,我的意思是我在哪裏找到它? –

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將替代它。

+0

非常感謝這些信息。但是現在我不知道是否應該將我的答案標記爲正確或者是你的答案,因爲它們都是答案的一部分^^ – LiohAu

+0

感謝您的解決方案!我試圖弄清楚爲什麼儀器會警告我,我的應用程序需要用開發標識進行簽名,當所有事情都同意時,我就是這樣。我必須更新我的辭職腳本才能在簽名爲開發版本時將get-task-allow設置爲true。 – Seth

相關問題