Mac App Store için çerçeve paketlerini nasıl kodlarsınız?


81

Yakın zamanda yapılan bir gönderimden sonra aşağıdaki hatayı aldım:

Geçersiz İmza - yuvalanmış uygulama paketi (FooBar.app/Contents/Frameworks/GData.framework) imzalanmamış, imza geçersiz veya Apple gönderim sertifikası ile imzalanmamış. Daha fazla bilgi için Kod İmzalama ve Uygulama Korumalı Alan Kılavuzu'na bakın.

Geçersiz İmza - yuvalanmış uygulama paketi (FooBar.app/Contents/Frameworks/Growl.framework) imzalanmamış, imza geçersiz veya bir Apple gönderim sertifikasıyla imzalanmamış. Daha fazla bilgi için Kod İmzalama ve Uygulama Korumalı Alan Kılavuzu'na bakın.

Geçersiz İmza - yuvalanmış uygulama paketi libcurl (FooBar.app/Contents/Frameworks/libcurl.framework) imzalanmamış, imza geçersiz veya bir Apple gönderim sertifikasıyla imzalanmamış. Daha fazla bilgi için Kod İmzalama ve Uygulama Korumalı Alan Kılavuzu'na bakın.

Bu yüzden Technote 2206'ya göre tüm çerçeve paketlerini imzaladım :

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 diyor ki:

Çerçeveleri İmzalama

Çerçeveler demetler olarak görüldüğünde, bir çerçeveyi doğrudan imzalayabileceğiniz sonucuna varmak mantıklı görünebilir. Ancak durum bu değil. Çerçeveleri imzalarken sorunlardan kaçınmak için, tüm çerçevenin aksine belirli bir sürümü imzaladığınızdan emin olun:

# Bu yanlış yoldur:

codeign -s benim-imzalama-kimliğim ../FooBarBaz.framework

# Bu doğru yoldur:

codeign -s benim-imzam-kimliğim ../FooBarBaz.framework/Versions/A

Ve sonuçları doğrulamaya çalıştığımda, bana iyi görünüyor:

% 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

Eğlence için, çerçeve paketini doğrudan imzalamayı denedim ve yine de reddedildi. Ancak bu, belgelerin yapmamayı söylediği şeydi.

Bunun neden geçersiz sayılacağına dair herhangi bir tahmin var mı? Uygulamamı kod imzalamak için kullandığım sertifikanın aynısını kullanıyorum - geçmişte işe yaramış olan.

Tek tahminim mevcut plistlerle (çerçevenin Info.plists içindeki tanımlayıcılara sahip olmam gerekir mi?) Veya yetkilerle ilgili bir şey olabilir mi - herhangi bir öneri?


Ben de bunu daha önce uygulamamı gönderirken keşfettim. Neyse ki Apple bunu reddetmedi, ancak daha sonra çerçeveleri imzalamamız gerekeceğini belirtti. Growl google kod sorunları sayfasında yayınlamanın daha iyi olacağını düşünüyorum ve çok yakında insanlar aynı problemle karşılaşacaklar.
koo

2
Growl çerçevesiyle bir uygulama gönderirken de bu sorunla karşılaştım. Growl.framework paket tanımlayıcısını sahip olduğunuz bir tanesiyle değiştirmeniz ve sonra onu kodlamanız gerekeceğini tahmin ediyorum.
Andrew

Bu garip: Her ikisi de imzasız olan iki çerçeve (CorePlot ve MacRuby) içeren bir uygulama yayınladım. Uygulama paketinde kod işareti komutunu yalnızca bir kez çalıştırıyorum ve uygulama, çerçeve hakkında herhangi bir yorum yapılmadan kabul edildi. Şimdi uygulama paketine ( bit.ly/charterapp ) bakarsanız , her iki çerçeve de imzalanmış görünüyor. Tüm uygulamayı imzalamayı mı denediniz?
p4010

@ p4010, yaptım - daha önce imzasızdılar. Örneğin homurtu, sadece dağıttıkları düz paketti. Şimdi, bu uygulamayı mağazada bir süredir kullanıyorum, bu yüzden bunun yeni korumalı alanla ilgisi olduğunu varsayıyorum. Uygulamanızı ne zaman gönderdiniz?
csexton

@Andrew, paket tanımlayıcısını değiştirmek sizin için işe yaradı mı?
csexton

Yanıtlar:


46

Baptr'ın cevabına dayanarak, tüm çerçevelerimi ve diğer ikili kaynakları / yardımcı yürütülebilir dosyaları (şu anda desteklenen türler: dylib, paket ve oturum açma öğeleri) kodlayan bu kabuk komut dosyasını geliştirdim:

#!/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. Projenizdeki bir dosyaya kaydedin. ScriptsKopyamı projemin kök dizinindeki bir alt dizinde saklıyorum.
    • Benimki denir codesign-frameworks.sh.
  2. "Gömülü Çerçeveleri Kopyala" derleme aşamanızın hemen ardından bir "Komut Dosyası Çalıştır" oluşturma aşaması ekleyin.
    • Buna "Codesign Embedded Frameworks" diyebilirsiniz.
  3. ./codesign-frameworks.shKomut dosyası düzenleyicisi metin alanına yapıştırın (veya yukarıda komut dosyanızı ne dediğini). ./Scripts/codesign-frameworks.shKomut dosyasını bir alt dizinde depoluyorsanız kullanın .
  4. Uygulamanızı oluşturun. Tüm paketlenmiş çerçeveler kod imzalanacaktır.

Hala bir " Kimlik : belirsiz (eşleşiyor:…" hatası alıyorsanız, lütfen aşağıya yorum yapın. Bu artık olmamalı.

Güncellenmiş 2012-11-14: Adlarında özel karakterler bulunan çerçeveler için destek ekleniyor (bu tek tırnak işaretleri içermez) "codeign-frameworks.sh" 'a ekleniyor.

2013-01-30 güncellendi: "codesign-frameworks.sh" dosyasına tüm yollarda (bu tek tırnak işaretlerini içermelidir) özel karakterler için destek ekleniyor.

Güncelleme 2013-10-29: Deneysel dylib desteği ekleniyor.

Güncellenmiş 2013-11-28: Yetki desteği ekleniyor. Deneysel dylib desteğinin geliştirilmesi.

2014-06-13'te güncellendi: Çerçeveler içeren (iç içe geçmiş) çerçevelerle ilgili kod imzalama sorunlarını düzeltme. Bu, önce derinlik geçişi yapılmasına neden olan -depthseçeneğine seçenek eklenerek yapıldı . Bu, burada açıklanan sorun nedeniyle gerekli hale geldi . Kısacası: içeren bir paket yalnızca iç içe geçmiş paketleri zaten imzalanmışsa imzalanabilir.findfind

Güncellenmiş 2014-06-28: Deneysel paket desteği ekleniyor.

Güncelleme 2014-08-22: Kodu iyileştirme ve IFS'yi geri yükleme başarısızlığını önleme.

Güncelleme 2014-09-26: Oturum açma öğeleri için destek ekleniyor.

Güncellenmiş 2014-10-26: Dizin denetimlerinden alıntı yapma. Bu, özel karakterler içeren yollar için "satır 31/42: çok fazla argüman" hatasını ve ortaya çıkan "kod nesnesi hiç imzalanmadı" hatasını düzeltir.

Güncellenmiş 2014-11-07: Xcode'da otomatik kimlik çözümlemesi kullanılırken belirsiz kimlik hatasını ("Mac Developer: belirsiz…" gibi) çözme. Artık kimliği açıkça belirlemenize gerek yok ve sadece “Mac Developer” kullanabilirsiniz!

2015-08-07 güncellendi: Anlambilimi geliştirme.

İyileştirmeler hoş geldiniz!


Bunun için teşekkürler, sadece bir not, hedefinizin adında bir boşluk varsa işe yaramaz. Düzeltmeye çalıştım ama işe yaramadım, bu yüzden hedefi değiştirdim.
Craig

FRAMEWORK_DIR, adında boşluklar / özel karakterler olduğunda şimdi çalışmalıdır.
Ocak 16'12

Ancak, codign komutunun sonuna "--timestamp" ekleyerek zaman damgası seçeneğini devre dışı bırakmam gerekiyordu.
Elmer Cat

İlginç. @Elmer Cat, bunu şans eseri OS X'in yayınlanmamış bir sürümünde mi yapıyorsunuz? Man sayfası, "sisteme özgü varsayılan davranışa" sahip bu seçeneği açıklar.
OcakX2

1
Elmer Cat - Xcode'un hangi sürümünü çalıştırdığınızı bilmiyorum ama 5.0.1 kullanıyorum ve kesinlikle çerçevelerimi otomatik olarak imzalamıyor. Bu senaryoyu bulana kadar saçımı yırtıyordum.
Bryan

11

Yorumunuz, paketin sürüm dizinindeki nesneleri imzaladığınızı gösterir. Technote, dizinin kendisini imzalamayı gösterir.

Aşağıdakiler, Technote ile daha iyi eşleşir:

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

4

Ben böyle düzelttim;

  • Hedefinizin yapı ayarlarına girin
  • "Diğer Kod İmzalama Bayrakları" satırını bulun
  • Release parametresine --deep değerini girin
  • XCode'u kapat
  • Mac'inizdeki türetilmiş veri klasörüne girin ve türetilmiş eski verileri silin (varsayılan yol: / Users / YOUR_USER_NAME / Library / Developer / Xcode / DerivedData)
  • Xcode'u açın ve derleyin

Arşivi oluşturduktan sonra uygulamayı tekrar gönderin ...


3
Bir rüya dünyasında "--derin" beklendiği gibi çalışırdı ama bir rüya dünyasında yaşamıyoruz ...
mike

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.