Condividi tramite


È possibile aggiungere o rimuovere file da un file IPA dopo averlo compilato in Visual Studio?

Sì, è possibile, ma in genere è necessario firmare nuovamente il .app bundle dopo aver apportato la modifica.

Si noti che la modifica del .ipa file non è necessaria in uso normale. Questo articolo viene fornito esclusivamente a scopo informativo.

Esempio: rimozione di un file da un .ipa archivio

Per questo esempio si presuppone che il nome del progetto Xamarin.iOS sia iPhoneApp1 e che generated session id sia cc530d20d6b19da63f6f1c6f67a0a254

  1. Compilare il .ipa file come di consueto da Visual Studio.

  2. Passare all'host di compilazione Mac.

  3. Trovare la compilazione nella ~/Library/Caches/Xamarin/mtbs/builds cartella . Puoi incollare questo percorso nel Finder > Vai > alla cartella per esplorare la cartella nel Finder. Cercare la cartella corrispondente al nome del progetto. All'interno di tale cartella cercare la cartella corrispondente a generated session id della compilazione. Questa sarà probabilmente la sottocartella con l'ora di modifica più recente.

  4. Aprire una nuova Terminal.app finestra.

  5. Digitare cd nella finestra Terminal.app, quindi trascinare e rilasciare la generated session id cartella nella Terminal.app finestra:

    Locating the generated session id folder in Finder

  6. Digitare la chiave restituita per modificare la directory nella generated session id cartella .

  7. Decomprimere il .ipa file in una cartella temporanea old/ usando il comando seguente. Modificare i Ad-Hoc nomi e iPhoneApp1 in base alle esigenze per il progetto specifico.

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

  8. Mantenere aperta la Terminal.app finestra.

  9. Eliminare i file desiderati da .ipa. È possibile spostarli nel Cestino usando Finder oppure eliminarli nella riga di comando usando Terminal.app. Per visualizzare il contenuto del Payload/iPhone file nel Finder, fare clic sul file e selezionare Mostra contenuto pacchetto.

  10. Usando lo stesso approccio generale del passaggio 3, trovare il file di log in ~/Library/Logs/Xamarin/MonoTouchVS/ con il nome del progetto e nel generated session id nome: Locate the project build log in Finder

  11. Aprire il log di compilazione del passaggio 10, ad esempio facendo doppio clic su di esso.

  12. Trovare la riga che include tool /usr/bin/codesign execution started with arguments: -v --force --sign.

  13. Digitare /usr/bin/codesign nella finestra Terminal.app del passaggio 8.

  14. Copiare tutti gli argomenti a partire -v dalla riga nel passaggio 12 e incollarli nella finestra di Terminal.app.

  15. Modificare l'ultimo argomento in modo che sia il .app bundle che si trova all'interno della old/Payload/ cartella e quindi eseguire il comando .

    /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. Passare alla old/ directory in Terminale:

    cd old
    
  17. Comprimere il contenuto della directory in un nuovo .ipa file usando il zip comando . È possibile modificare l'argomento "$HOME/Desktop/iPhoneApp1-1.0.ipa" in modo da restituire il .ipa file ovunque si desideri:

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

Messaggi di errore comuni

Se viene visualizzato Invalid Signature. A sealed resource is missing or invalid., significa in genere che qualcosa è stato modificato all'interno del .app bundle e che il .app bundle non è stato firmato correttamente in seguito. Si noti anche che se si vuole creare un oggetto .ipa con un profilo di distribuzione, è necessario compilare l'originale .ipa con un profilo di distribuzione. In caso contrario, l'oggetto Entitlements.xcent non sarà corretto.

Per fornire un esempio concreto di come può verificarsi questo errore, se si esegue il comando seguente codesign --verify nella finestra del terminale dopo il passaggio 9, verrà visualizzato l'errore insieme alla causa esatta dell'errore:

$ 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

E il processo di verifica dell'App Store segnala un messaggio di errore simile:

ERRORE ITMS-90035: "Firma non valida. Una risorsa sealed è mancante o non valida. Il file binario nel percorso [i Telefono App1.app/i Telefono App1] contiene una firma non valida. Assicurarsi di aver firmato l'applicazione con un certificato di distribuzione, non un certificato ad hoc o un certificato di sviluppo. Verificare che le impostazioni di firma del codice in Xcode siano corrette a livello di destinazione (che eseguono l'override di tutti i valori a livello di progetto). Assicurarsi inoltre che il bundle che si sta caricando sia stato compilato usando una destinazione di rilascio in Xcode, non una destinazione del simulatore. Se si è certi che le impostazioni di firma del codice sono corrette, scegliere "Pulisci tutto" in Xcode, eliminare la directory "build" nel Finder e ricompilare la destinazione di rilascio. Per altre informazioni, consultare https://developer.apple.com/library/ios/documentation/Security/Conceptual/CodeSigningGuide/Introduction/Introduction.html"