82 votes

Comment vous codesign bundles de cadre pour le Mac App Store ?

Après une présentation récente, j'ai obtenu l'erreur suivante:

Signature non valide - la imbriquée app bundle (FooBar.app/Contents/Frameworks/GData.cadre) n'est pas signé, la signature n'est pas valide, ou il n'est pas signé avec une Pomme de présentation de certificat. Reportez-vous à la Signature de Code et l'Application de Sandboxing Guide pour plus d'informations.

Signature non valide - la imbriquée app bundle (FooBar.app/Contents/Frameworks/Growl.cadre) n'est pas signé, la signature n'est pas valide, ou il n'est pas signé avec une Pomme de présentation de certificat. Reportez-vous à la Signature de Code et l'Application de Sandboxing Guide pour plus d'informations.

Signature non valide - la imbriquée app bundle libcurl (FooBar.app/Contents/Frameworks/libcurl.cadre) n'est pas signé, la signature n'est pas valide, ou il n'est pas signé avec une Pomme de présentation de certificat. Reportez-vous à la Signature de Code et l'Application de Sandboxing Guide pour plus d'informations.

Donc j'ai signé tous les cadre de grappes par Technote 2206:

codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A/libcurl
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A/libssh2.1.dylib
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./Growl.framework/Versions/A/Growl
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./GData.framework/Versions/A/GData

Technote 2206 dit:

La Signature De Cadres

Voyant que les cadres sont bundles il semble logique de conclure que vous pouvez signer un cadre directement. Cependant, ce n'est pas le cas. Pour éviter les problèmes lors de la signature de cadres assurez-vous de signer une version spécifique par opposition à l'ensemble du cadre:

# C'est la mauvaise façon:

codesign -mon-signature-de l'identité ../FooBarBaz.cadre

# C'est la bonne façon:

codesign -mon-signature-de l'identité ../FooBarBaz.framework/Versions/A

Et quand j'ai essayer de vérifier les résultats, il me semble bon:

% codesign -vvv FooBar.app/Contents/Frameworks/libcurl.framework
FooBar.app/Contents/Frameworks/libcurl.framework: valid on disk
FooBar.app/Contents/Frameworks/libcurl.framework: satisfies its Designated Requirement
% codesign -vvv FooBar.app/Contents/Frameworks/Growl.framework
FooBar.app/Contents/Frameworks/Growl.framework: valid on disk
FooBar.app/Contents/Frameworks/Growl.framework: satisfies its Designated Requirement

Pour le fun, j'ai essayé de signer le cadre bundle directement et il a toujours rejeté. Mais c'est exactement ce que la documentation a dit de ne pas le faire.

Toute devine pourquoi ce serait considéré comme non valide? Je suis en utilisant le même cert que j'utilise pour le code de signer mon app -- celui qui a travaillé dans le passé.

Ma seule imagine être quelque chose à faire avec l'existant plists (ai-je besoin de posséder des identifiants dans le cadre de l'Info.les plists?) ou des droits -- des suggestions?

50voto

JanX2 Points 566

Basé sur baptr réponse, j'ai développé ce script shell qui codesigns tous mes cadres:

#!/bin/sh

# WARNING: You may have to run Clean in Xcode after changing CODE_SIGN_IDENTITY! 

# Verify that $CODE_SIGN_IDENTITY is set
if [ -z "${CODE_SIGN_IDENTITY}" ] ; then
    echo "CODE_SIGN_IDENTITY needs to be set for framework code-signing!"

    if [ "${CONFIGURATION}" = "Release" ] ; then
        exit 1
    else
        # Code-signing is optional for non-release builds.
        exit 0
    fi
fi

if [ -z "${CODE_SIGN_ENTITLEMENTS}" ] ; then
    echo "CODE_SIGN_ENTITLEMENTS needs to be set for framework code-signing!"

    if [ "${CONFIGURATION}" = "Release" ] ; then
        exit 1
    else
        # Code-signing is optional for non-release builds.
        exit 0
    fi
fi

ITEMS=""

FRAMEWORK_DIR="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
if [ -d "$FRAMEWORK_DIR" ] ; then
    FRAMEWORKS=$(find "${FRAMEWORK_DIR}" -depth -type d -name "*.framework" -or -name "*.dylib" -or -name "*.bundle" | sed -e "s/\(.*framework\)/\1\/Versions\/A\//")
    RESULT=$?
    if [[ $RESULT != 0 ]] ; then
        exit 1
    fi

    ITEMS="${FRAMEWORKS}"
fi

LOGINITEMS_DIR="${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Library/LoginItems/"
if [ -d "$LOGINITEMS_DIR" ] ; then
    LOGINITEMS=$(find "${LOGINITEMS_DIR}" -depth -type d -name "*.app")
    RESULT=$?
    if [[ $RESULT != 0 ]] ; then
        exit 1
    fi

    ITEMS="${ITEMS}"$'\n'"${LOGINITEMS}"
fi

echo "Identity:"
echo "${CODE_SIGN_IDENTITY}"

echo "Entitlements:"
echo "${CODE_SIGN_ENTITLEMENTS}"

echo "Found:"
echo "${ITEMS}"

# Change the Internal Field Separator (IFS) so that spaces in paths will not cause problems below.
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")

# Loop through all items.
for ITEM in $ITEMS;
do
    echo "Signing '${ITEM}'"
    codesign --force --verbose --sign "${CODE_SIGN_IDENTITY}" --entitlements "${CODE_SIGN_ENTITLEMENTS}" "${ITEM}"
    RESULT=$?
    if [[ $RESULT != 0 ]] ; then
        IFS=$SAVEIFS
        exit 1
    fi
done

# Restore $IFS.
IFS=$SAVEIFS
  1. L'enregistrer dans un fichier de votre projet.
    • Le mien s'appelle codesign-frameworks.sh.
  2. Ajouter un "Run Script" construire la phase juste après votre "Copie Intégré Cadres" phase de construction.
    • Vous pouvez l'appeler "Codesign Intégré Cadres".
  3. Collez ./codesign-frameworks.sh (ou tout ce que vous avez appelé le script ci-dessus) dans l'éditeur de script champ de texte.
  4. Construisez votre application. Tous groupés cadres codesigned.

Si vous obtenez un "Identité: ambigu (correspond à: ..." s'affiche, assurez-vous que votre CODE_SIGN_IDENTITY est définie explicite de l'identité comme "Développeur Mac: le NOM de VOTRE IDENTITÉ (ALPHANUMÉRIQUE-ID)".

Mise à jour 2012-11-14: Ajout du support pour les cadres avec des caractères spéciaux dans leur nom (cela ne comprend pas les guillemets simples) "codesign-frameworks.sh".

Mise à jour 2013-01-30: Ajout du support pour les caractères spéciaux dans tous les chemins (ce qui devrait inclure des guillemets simples) "codesign-frameworks.sh".

Mise à jour 2013-10-29: Ajout expérimentale dylib de soutien.

Mise à jour 2013-11-28: Ajouter des droits à l'appui. L'amélioration expérimentale dylib de soutien.

Mise à jour 2014-06-13: Fixation codesigning problèmes avec les cadres contenant (nested) les cadres. Cela a été fait par l'ajout -depth option d' find, ce qui provoque find faire profondeur d'abord la traversée. Cela est devenu nécessaire, car le problème décrit ici. En bref: un bundle contenant ne peut être signé que si son imbriqués les paquets sont signés déjà.

Mise à jour 2014-06-28: Ajout expérimentale bundle de soutien.

Mise à jour 2014-08-22: Amélioration du code et de la prévention de l'échec de la restauration de l'IFS.

Mise à jour 2014-09-26: Ajout du support pour les éléments de connexion.

Mise à jour 2014-10-26: Citant répertoire des contrôles. Cette mise à jour corrige la "ligne 31/42: trop d'arguments" les erreurs et le "code objet n'est pas signé" d'erreur pour les chemins y compris les caractères spéciaux.

Des améliorations sont les bienvenues!

11voto

baptr Points 93

Votre commentaire montre que vous avez signé les objets dans le répertoire de la version de l’ensemble. La note technique présente pour signer le répertoire lui-même.

Ce qui suit correspond mieux à la note technique :

0voto

Ross Bencina Points 894

Une chose que je ne vois pas mentionné ici est que vous devez avoir votre Info.plist dans /Ressources à l'intérieur de la version du cadre de répertoire. Sinon, vous allez obtenir le "bundle format non reconnu, non valide, ou inadaptés" erreur lorsque vous essayez de vous connecter au répertoire versionné.

J'ai fourni une plus longue réponse ici: Comment Dessiner Grognement.cadre pour bac à sable Mac App

0voto

ios_user Points 56

Nous avons le même problème quand soumettre application avec framework non signé personnalisé. Même vous signez le framwork par xcode ou par ligne de commande de codesign, appstore rejettera votre demande par un popup, il est dit que le cadre a un signe de code non valide et le cadre est construit à l’aide de projet bundle, nous essayons encore le projet de modèle de cadre mais quand même rejetons. Le seul message qu’il dit est que le projet de cadre est pris en charge uniquement pour les IOS 8.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X