Jak kodować Pakiety frameworków dla Mac App Store?

Po ostatnim zgłoszeniu otrzymałem następujący błąd:

Invalid Signature-zagnieżdżony pakiet aplikacji (FooBar.app / Contents / Framework/GData.framework) nie jest podpisany, podpis jest nieprawidłowy lub nie jest podpisany certyfikatem Apple submission. Aby uzyskać więcej informacji, zapoznaj się z przewodnikiem podpisywania kodu i piaskowania aplikacji.

Invalid Signature-zagnieżdżony pakiet aplikacji (FooBar.app / Contents / Framework/Growl.framework) nie jest podpisany, podpis jest nieprawidłowy lub nie jest podpisany certyfikatem Apple submission. Aby uzyskać więcej informacji, zapoznaj się z przewodnikiem podpisywania kodu i piaskowania aplikacji.

Invalid Signature-zagnieżdżony pakiet aplikacji libcurl (FooBar.app / Contents / Framework/libcurl.framework) nie jest podpisany, podpis jest nieprawidłowy lub nie jest podpisany certyfikatem Apple submission. Aby uzyskać więcej informacji, zapoznaj się z przewodnikiem podpisywania kodu i piaskowania aplikacji.

Więc podpisałem wszystkie ramy pakiety na 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 says:

Podpisywanie Frameworków

Ponieważ frameworki są pakietami, logicznym wydaje się stwierdzenie, że można podpisać framework bezpośrednio. Jednak tak nie jest. Aby uniknąć problemów podczas podpisywania frameworków, upewnij się, że podpisujesz określoną wersję, a nie cały framework:

# This is the wrong way:

Codesign - s my-signing-identity ../ FooBarBazframework

# This is the right way:

Codesign - s my-signing-identity ../ FooBarBazframework/Versions / a

I kiedy próbuję zweryfikować wyniki, wygląda mi to dobrze:

% 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

Dla Zabawy, próbowałem podpisać pakiet framework bezpośrednio i nadal został odrzucony. Ale to jest dokładnie to, co w dokumentacji powiedział, aby nie robić.

Jakieś przypuszczenia, dlaczego miałoby to być uznane za nieważne? Używam tego samego certyfikatu, którego używam do podpisywania kodu w aplikacji -- ten, który działał w przeszłości.

Moim jedynym przypuszczeniem byłoby coś wspólnego z istniejącymi plistami (Czy muszę posiadać identyfikatory w Info frameworka.PLIST?) lub uprawnienia-jakieś sugestie?

Author: csexton, 2011-10-08

4 answers

Bazując na odpowiedzi baptr, stworzyłem skrypt powłoki, który koduje wszystkie moje frameworki i inne zasoby binarne / pomocnicze pliki wykonywalne (obecnie obsługiwane typy: dylib, bundle i login items):

#!/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=""

FRAMEWORKS_DIR="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}"
if [ -d "$FRAMEWORKS_DIR" ] ; then
    FRAMEWORKS=$(find "${FRAMEWORKS_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

# Prefer the expanded name, if available.
CODE_SIGN_IDENTITY_FOR_ITEMS="${EXPANDED_CODE_SIGN_IDENTITY_NAME}"
if [ "${CODE_SIGN_IDENTITY_FOR_ITEMS}" = "" ] ; then
    # Fall back to old behavior.
    CODE_SIGN_IDENTITY_FOR_ITEMS="${CODE_SIGN_IDENTITY}"
fi

echo "Identity:"
echo "${CODE_SIGN_IDENTITY_FOR_ITEMS}"

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.
SAVED_IFS=$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_FOR_ITEMS}" --entitlements "${CODE_SIGN_ENTITLEMENTS}" "${ITEM}"
    RESULT=$?
    if [[ $RESULT != 0 ]] ; then
        echo "Failed to sign '${ITEM}'."
        IFS=$SAVED_IFS
        exit 1
    fi
done

# Restore $IFS.
IFS=$SAVED_IFS
  1. zapisz go do pliku w swoim projekcie. Przechowuję swoją kopię w podkatalogu Scripts w katalogu głównym mojego projektu.
    • mój nazywa się codesign-frameworks.sh.
  2. Dodaj fazę kompilacji "Uruchom skrypt" zaraz po kompilacji "Kopiuj osadzone frameworki" Faza.
    • można go nazwać "wbudowanymi frameworkami Codesign".
  3. wklej ./codesign-frameworks.sh (lub jak to nazwałeś skrypt powyżej) do pola tekstowego Edytora skryptów. Użyj ./Scripts/codesign-frameworks.sh, jeśli przechowujesz skrypt w podkatalogu.
  4. Zbuduj swoją aplikację. Wszystkie dołączone frameworki będą opatrzone kodem.

Jeśli nadal masz błąd " Identity : ambiguous (matches:...", proszę skomentuj poniżej. To już nie powinno się zdarzyć.

Aktualizacja 2012-11-14: Dodanie obsługa frameworków ze znakami specjalnymi w nazwie (nie obejmuje to pojedynczych cudzysłowów) do "codesign-frameworks.sh".

Zaktualizowano 2013-01-30: dodanie obsługi znaków specjalnych we wszystkich ścieżkach (powinno to zawierać pojedyncze cudzysłowy) do "codesign-frameworks.sh".

Zaktualizowano 2013-10-29: dodanie eksperymentalnej obsługi dylib.

Zaktualizowano 2013-11-28: dodawanie obsługi uprawnień. Poprawa eksperymentalnego wsparcia dylib.

Zaktualizowano 2014-06-13: Naprawianie problemów z kodami z frameworkami zawierającymi (zagnieżdżone) frameworki. Zostało to zrobione przez dodanie opcji -depth do find, co powoduje, że find wykonuje przejście na głębokość. Stało się to konieczne ze względu na problem opisany tutaj. W skrócie: pakiet zawierający może być podpisany tylko wtedy, gdy jego zagnieżdżone pakiety są już podpisane.

Zaktualizowano 2014-06-28: dodanie obsługi eksperymentalnego pakietu.

Zaktualizowano 2014-08-22: Ulepszanie kodu i zapobieganie niepowodzeniom w przywracaniu systemu IFS.

Aktualizacja 2014-09-26: Dodawanie obsługi elementów logowania.

Zaktualizowano 2014-10-26: cytowanie sprawdzania katalogu. Naprawia to błędy "line 31/42: too many arguments" i wynikający z tego błąd "code object is not signed at all" dla ścieżek zawierających znaki specjalne.

Zaktualizowano 2014-11-07: rozwiązywanie błędu wieloznacznej tożsamości (jak "Mac Developer: wieloznaczna ...") podczas korzystania z automatycznego rozwiązywania tożsamości w Xcode. Nie musisz już jawnie ustawiać tożsamości i możesz po prostu użyć " Mac Deweloper"!

Zaktualizowano 2015-08-07: Poprawa semantyki.

Ulepszenia mile widziane!

 40
Author: JanX2,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-07 11:37:00

Twój komentarz pokazuje, że podpisałeś obiekty w katalogu wersji pakietu. Technote pokazuje, aby podpisać katalog.

Następujące elementy lepiej pasują do Technote:

codesign -f -v -s "3rd Party Mac Developer Application: Name" ./libcurl.framework/Versions/A
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./Growl.framework/Versions/A
codesign -f -v -s "3rd Party Mac Developer Application: Name" ./GData.framework/Versions/A
 10
Author: baptr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-12-02 07:47:10

Tak to naprawiłem;

  • Wprowadź ustawienia budowania celu
  • Fing linii "inne flagi podpisywania kodu"
  • wprowadź --deep wartość do parametru release
  • Zamknij XCode
  • wejdź do folderu danych pochodnych na komputerze Mac i usuń stare dane pochodne (domyślna ścieżka to: /Users/YOUR_USER_NAME/Library/Developer/Xcode/DerivedData)
  • Otwórz Xcode i zbuduj

Po zbudowaniu archiwum i przesłaniu aplikacji ponownie...

 2
Author: emreoktem,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-11 12:20:36

Jedna rzecz, której tu nie widzę, to to, że musisz mieć swoje informacje.plist inside / Resources wewnątrz wersjonowanego katalogu framework. W przeciwnym razie podczas próby podpisania wersjonowanego katalogu pojawi się błąd "Format pakietu nierozpoznany, nieprawidłowy lub nieodpowiedni".

Podałem tutaj bardziej rozbudowaną odpowiedź: Jak Codesign Growl.framework for Sandbox Mac App

 0
Author: Ross Bencina,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:33:27