簡體   English   中英

使用可配置的捆綁包標識符構建和簽名iOS應用程序以支持多種構建配置的問題

[英]Issue with building and signing an iOS app with a configurable bundle identifier to support multiple build configurations

我正在嘗試構建我的應用程序的多個並行構建(一個用於模擬環境,一個用於開發環境,一個用於測試環境,一個用於生產版本)。

我已經取得了很大的進展,但是在使用自動生成的包標識符(一個運行於變量的應用程序)對應用程序進行代碼簽名時遇到了問題。

我做了什么

我正在使用臨時配置文件使用xCode 4.6.3。

為了使它起作用,我在info plist文件中將我的包標識符設置為在某種程度上運行一個變量-因此可以用不同的方式對應用程序進行簽名。 例如,我的實際捆綁包標識符為:

  • UXXXXXX.au.com.blah.MOCK
  • UXXXXXX.au.com.blah.DEV
  • UXXXXXX.au.com.blah.TEST
  • UXXXXXX.au.com.blah.PROD

因此,我的信息列表中的捆綁包標識符已配置為“ UXXXXXX.au.com.blah。$ {BUNDLE_SUFFIX}”

現在,為了允許我針對每個構建版本不同地構建應用程序,我執行了以下操作:

  • 我有4個不同的包標識符,並為這些包標識符分配了4個不同的配置文件
  • 首先,我添加了一個名為“ MOCK”的新配置(稍后將添加其他配置)
  • 然后在項目構建設置下,我向項目中添加了BUNDLE_SUFFIX用戶定義的變量,並將其設置為MOCK以進行MOCK配置(稍后將添加其他變量)。 這用於為使用MOCK配置的版本設置捆綁包標識符。
  • 然后在項目構建設置下,為構建設置中的MOCK配置選擇我的MOCK配置文件
  • 我注意到,如果我轉到應用程序目標上的摘要視圖,它將捆綁包ID顯示為UXXXXXX.au.com.blah.MOCK,其中“ MOCK”部分為灰色字體-因此它選擇了捆綁包后綴變量
  • 然后,我創建了一個稱為MOCK的新方案,以將MOCK配置用於“配置文件”和“存檔”。 我剩下的默認值(使用DEBUG)。

因此,現在我可以運行xcodebuild並使用方案MOCK進行MOCK特定的構建,該構建將使用MOCK配置將捆綁包標識符設置為.MOCK並將我的權限配置文件設置為使用_MOCK配置文件。

所以我然后運行了一個jenkins構建,該構建執行xcodebuild和xcrun(將稱為codesign)。

這是我的xcodebuild命令:

/usr/bin/xcodebuild -scheme MOCK -sdk iphoneos -project MyApp.xcodeproj -configuration MOCK clean build "CONFIGURATION_BUILD_DIR=/Users/CI/Documents/workspace/build3" ONLY_ACTIVE_ARCH=NO DEPLOY_ENVIRONMENT=MOCK "CODE_SIGN_IDENTITY=iPhone Distribution: My Company" "PROVISIONING_PROFILE=XXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX"

這是我的xcrun命令:

/usr/bin/xcrun -sdk iphoneos PackageApplication -v "/Users/Shared/Jenkins/Home/jobs/MyApp.app" -o "/Users/Shared/Jenkins/Home/jobs/MyApp/workspace/build/MyApp-0.9.5.0.ipa" --embed "/Users/Shared/Jenkins/Home/Library/MobileDevice/Provisioning Profiles/20130816_Distribution_MOCK.mobileprovision" --sign "iPhone Distribution: My Company"

注意:我專門使用MOCK設置配置文件對應用程序進行簽名,因為我發現我無法使用。*配置文件對應用程序進行簽名,因為該應用程序使用推送通知,並且如果我使用。*生成應用程序,然后重新簽名具有正確配置文件的應用程序,我的Embedded.mobileprovision配置文件將被更新,但.app文件中的實際可執行文件永遠不會更新。 這會導致推送通知永遠不會到達設備。 因此,我需要開始工作的是能夠從命令行使用具有捆綁ID(使用變量動態填充)的應用來構建和簽名應用。 而且我似乎無法使它正常工作。

結果

xcodebuild成功運行並完美運行。 該應用似乎已正確構建並使用.MOCK並使用_MOCK設置配置文件進行了簽名!

但! IPA文件的生成有問題,我的代碼簽名有問題。

請注意,我構建的應用程序沒有任何代碼簽名權利。 codesign給我這個錯誤:警告:應用程序未通過codesign驗證。 簽名無效,包含不允許的權利,或者未使用iPhone分發證書簽名。 (-19011)可執行文件= / Users / CI / Documents / workspace / build3 / MyApp.app / MyApp codesign_wrapper-4.1:使用Apple CA進行配置文件評估非法授權密鑰/值對:application-identifier, UXXXXXX.au.com.blah 。 AssertMacros:filter_entitlements(entitlements_whitelist,entitlements_requested,allowable_entitlements),文件:codesign_wrapper.c,行:932-(空

請注意,它尚未選擇bundle_suffix。 另外,當我查看代碼簽名引用的MyApp.xcent文件時,我注意到它具有UXXXXXX.au.com.blah。 在里面。 它尚未獲取bundle_suffix的值!

因此,然后,我嘗試為MOCK構建配置創建一個entitlements.plist文件,並在構建設置下為MOCK配置的“代碼簽名權利”下添加指向該文件的鏈接。 但是現在我得到了一個不同的錯誤,它相當令人不安:

/usr/bin/codesign --force --sign 5XXXXXXXXXXXXXXXXXXX2c --resource-rules=/Users/CI/Documents/workspace/build3/MyApp.app/ResourceRules.plist --entitlements /Users/CI/Library/Developer/Xcode/DerivedData/MyApp-fasiktlyysoxjpgalujkfjpyiyeo/Build/Intermediates/MyApp.build/MOCK-iphoneos/MyApp.build/MyApp.xcent /Users/CI/Documents/workspace/build3/MyApp.app

驗證/Users/CI/Documents/workspace/build3/MyApp.app cd / Users / Shared / Jenkins / Home / jobs / MyApp-MOCK-HourlyBuilds / workspace setenv PATH“ /Applications/Xcode.app/Contents/Developer/Platforms/ iPhoneOS.platform / Developer / usr / bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/ usr / bin:/ bin:/ usr / sbin:/ sbin:/ usr / local / bin:/ usr / local / git / bin“ setenv PRODUCT_TYPE com.apple.product-type.application /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/Validation / Users / CI / Documents / workspace /build3/MyApp.app 警告:此捆綁包無效。 應用程序標識符的權限格式不正確; 它應包含10個字符的App ID種子,后跟一個圓點,然后是您的捆綁包標識符:UXXXXXXXX.au.com.amp.blah.MOCK(-19054)無法驗證您的應用程序。 - (空值)

這次實際上已經獲得了正確的捆綁包標識符! 它說它。 但是它在抱怨這個捆綁包是無效的...但是對我來說它看起來完全有效!! 為什么不起作用?

這是我手動創建並添加到項目中的entitlements.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>UXXXXXXXXXXX.au.com.amp.blah.MOCK</string>
    <key>aps-environment</key>
    <string>production</string>
    <key>get-task-allow</key>
    <false/>
    <key>keychain-access-groups</key>
    <array>
            <string>UXXXXXXXXXXX.au.com.amp.blah.MOCK</string>
    </array>
</dict>
</plist>

任何幫助將不勝感激,非常感謝!

PS:我知道解決這個問題的方法是為我的每個版本創建一個不同的Target。 但是我真的不想要這個,因為維持多個目標很痛苦。 如果可以的話,我真的很想嘗試在沒有多個目標的情況下擺脫困境。

PSS我知道解決此問題的另一種方法是,首先使用。*供應配置文件對應用程序進行簽名,然后使用正確的配置文件對應用程序進行簽名,但是這對我不起作用。 由於.app中的可執行文件仍保留對。*配置文件的引用。 因此,此設備永遠無法接收推送通知。 我收到“找不到適用於應用程序的有效'aps-environment'授權字符串”錯誤。

我正在通過Jenkins為我的iOS版本運行類似的設置,目的是允許並行安裝應用程序(生產,暫存,質量保證,開發),並遇到與您相同的問題。

最后,我偶然發現了這個答案,並對其進行了修改,使其包含--xcent文件,該文件是--entitlements標志的xcodebuild(檢查路徑的生成輸出)的一部分。 這意味着您不必手動創建權利文件,但是可以使用xcodebuild為您生成的確切文件。

我也使用過xcrun PackageApplication,但這不支持權利,因此使用此工具重新簽名會丟失權利。

因此,在運行xcodebuild之后,我使用plistbuddy修改我的info.plist文件以更新設置捆綁包等(這可能對您而言不是必需的),然后我將ipa解包,將配置文件和info.plist復制到解包的負載中,重新簽名並重新包裝:

pushd ${SCRIPT_DIR}
unzip "${PROJECT_NAME}.${CURRENT_ENV_NAME}.ipa"
rm -r "Payload/${PROJECT_NAME}.app/_CodeSignature" "Payload/${PROJECT_NAME}.app/CodeResources" 2> /dev/null | true
cp "${PROFILE}" "Payload/${PROJECT_NAME}.app/embedded.mobileprovision"
cp "${BUILD_DIR}/${BUILD_TARGET}-iphoneos/${PROJECT_NAME}.app/Info.plist" "Payload/Yappem.app/Info.plist"
/usr/bin/codesign -f -s "${CODE_SIGN_IDENTITY}" --resource-rules "Payload/${PROJECT_NAME}.app/ResourceRules.plist" --entitlements "${XCENT_FILE}" "Payload/${PROJECT_NAME}.app"
if [ $? != 0 ]; then
  echo Error Signing Project
  exit 1
fi
rm "${PROJECT_NAME}.${CURRENT_ENV_NAME}.ipa"
zip -qr "${PROJECT_NAME}.${CURRENT_ENV_NAME}.ipa" Payload
popd

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM