共用方式為


在 Visual Studio 中建置檔案之後,我可以將檔案新增至或移除 IPA 檔案嗎?

是的,這是可能的,但通常需要在進行變更之後重新簽署 .app 套件組合。

請注意,在一般使用中不需要修改 .ipa 檔案。 本文僅供參考之用。

範例:從 .ipa 封存中移除檔案

在此範例中,假設 Xamarin.iOS 專案的名稱是 iPhoneApp1 ,而 generated session idcc530d20d6b19da63f6f1c6f67a0a254

  1. 從 Visual Studio 正常建置 .ipa 檔案。

  2. 切換至 Mac 組建主機。

  3. 在資料夾中尋找組建 ~/Library/Caches/Xamarin/mtbs/builds 。 您可以將此路徑貼到 Finder > Go > to Folder ,以流覽 Finder 中的資料夾。 尋找符合項目名稱的資料夾。 在該資料夾中,尋找符合 generated session id 組建 之的資料夾。 這很可能是具有最近修改時間的子資料夾。

  4. 開啟新的 Terminal.app 視窗。

  5. 在 [Terminal.app] 視窗中輸入 cd ,然後將資料夾拖放 generated session idTerminal.app 視窗中:

    Locating the generated session id folder in Finder

  6. 輸入傳回索引鍵,將目錄變更為 generated session id 資料夾。

  7. 使用下列命令將 .ipa 檔案解壓縮到暫存 old/ 資料夾。 Ad-Hoc視需要調整特定專案的和 iPhoneApp1 名稱。

    ditto -xk bin/i 電話/Ad-Hoc/i 電話 App1-1.0.ipa old/

  8. Terminal.app讓視窗保持開啟。

  9. .ipa刪除所需的檔案。 您可以使用 Finder 將它們移至垃圾桶,或使用 在命令行 Terminal.app上刪除它們。 若要在 Finder 中檢視檔案的內容 Payload/iPhone ,請控制按兩下檔案,然後選取 [ 顯示套件內容]。

  10. 使用與步驟 3 相同的一般方法,在底下 ~/Library/Logs/Xamarin/MonoTouchVS/ 尋找同時具有專案名稱和 generated session id 名稱中的 記錄檔: Locate the project build log in Finder

  11. 從步驟 10 開啟組建記錄檔,例如按兩下它。

  12. 尋找包含 tool /usr/bin/codesign execution started with arguments: -v --force --sign的行。

  13. 在步驟 8 的 [Terminal.app] 視窗中輸入 /usr/bin/codesign

  14. 複製從步驟 12 行開始 -v 的所有自變數,並將其貼到 [Terminal.app] 視窗中。

  15. 將最後一個自變數變更為 .app 位於資料夾內的 old/Payload/ 套件組合,然後執行 命令。

    /usr/bin/codesign -v --force --sign SOME_LONG_STRING in/iPhone/Ad-Hoc/iPhoneApp1.app/ResourceRules.plist --entitlements obj/iPhone/Ad-Hoc/Entitlements.xcent old/Payload/iPhoneApp1.app
    
  16. 變更為 old/ 終端機中的目錄:

    cd old
    
  17. 使用 zip 命令,將目錄的內容壓縮成新的.ipa檔案。 您可以變更 "$HOME/Desktop/iPhoneApp1-1.0.ipa" 自變數,以在您想要的位置輸出 .ipa 檔案:

    zip -yr "$HOME/Desktop/iPhoneApp1-1.0.ipa" *
    

常見的錯誤訊息

如果您看到 Invalid Signature. A sealed resource is missing or invalid.,這通常表示套件組合內的 .app 某個專案已變更,而且 .app 套件組合之後未正確重新簽署。 另請注意,如果您想要使用散發設定檔建立 .ipa ,則必須使用散發設定檔來建置原始.ipa的 。 否則 Entitlements.xcent 會不正確。

若要提供如何發生此錯誤的具體範例,如果您在步驟 9 之後的終端機視窗中執行下列 codesign --verify 命令,您將會看到錯誤以及錯誤的確切原因:

$ codesign -dvvv --no-strict --verify old/Payload/iPhoneApp1.app
old/Payload/iPhoneApp1.app: a sealed resource is missing or invalid
file missing: /Users/macuser/Library/Caches/Xamarin/mtbs/builds/iPhoneApp1/cc530d20d6b19da63f6f1c6f67a0a254/old/Payload/iPhoneApp1.app/MyFile.png

App Store 驗證程式會回報類似的錯誤訊息:

錯誤 ITMS-90035:「無效的簽章。 密封的資源遺失或無效。 路徑 [i 電話 App1.app/i電話 App1] 的二進位檔包含無效的簽章。 請確定您已使用散發憑證簽署應用程式,而不是特定憑證或開發憑證。 確認 Xcode 中的程式代碼簽署設定在目標層級正確無誤(這會覆寫專案層級的任何值)。 此外,請確定您上傳的套件組合是使用 Xcode 中的發行目標所建置,而不是模擬器目標。 如果您確定程式代碼簽署設定正確,請在 Xcode 中選擇 [全部清除]、刪除 Finder 中的 [組建] 目錄,然後重建您的發行目標。 如需詳細資訊,請參閱 https://developer.apple.com/library/ios/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html