Ustawianie profilu obsługi z poziomu xcodebuild podczas tworzenia aplikacji na iPhone ' a

Używam xcodebuild do kompilacji aplikacji na iPhone ' a z linii poleceń. Czy jest jakiś sposób, aby przejść w jakiejś opcji, aby ustawić profil provisioning? Wydaje się, że nie ma zbyt wiele informacji o xcodebuild w ogóle.

Author: Corey Floyd, 2009-05-15

5 answers

Dokumentacja

Wygląda na to, że z dokumentu nie można ustawić pliku obsługi, ale można określić cel:

[-target targetname]

Tak więc, jeśli utworzysz cel dla każdego pliku aprowizacji, możesz wybrać odpowiedni cel z wiersza poleceń.

To w zasadzie osiągnie to, o co prosisz.

 4
Author: Corey Floyd,
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
2009-05-15 07:59:34

Właściwie, powinieneś być w stanie po prostu dodać go do Ustawienia linii poleceń XCode.

Xcodebuild [niezależnie od innych opcji, które posiadasz] PROVISIONING_PROFILE="[unikalny identyfikator twojego profilu tutaj] "

Ustawienia budowania z wiersza poleceń mają nadpisywać wszystko, więc powinno to przeważać nad wszystkim zdefiniowanym w projekcie lub obiekcie docelowym.

 85
Author: Rob,
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
2009-07-24 23:58:47

Moje rozwiązanie nie jest eleganckie, ale robi swoje i pozwala mi zautomatyzować wszystko na serwerze kompilacji:

#!/bin/bash

TARGET="Your App"
CONFIGURATION="Release"
SDK="iphoneos"
PROFILE_PATH="/Users/jkp/Desktop/foo.mobileprovision"
IDENTITY="iPhone Distribution: Your Company Ltd"
KEYCHAIN="/Users/jkp/Desktop/keychain"
PASSWORD="foobar"

open "${PROFILE_PATH}"
sleep 5
osascript -e "tell application \"Xcode\" to quit"
security unlock-keychain -p ${PASSWORD} ${KEYCHAIN}
xcodebuild \
  -target "${TARGET}" \
  -configuration ${CONFIGURATION} \
  -sdk iphoneos \
  CODE_SIGN_IDENTITY="${IDENTITY}" \    
  OTHER_CODE_SIGN_FLAGS="--keychain ${KEYCHAIN}"

Najważniejsze jest to, że nie musiałem najpierw instalować profilu provisioning. Właściwie mam inny skrypt, który używa mechanize, aby pobrać najnowszą kopię profilu provisioning przed każdym zbudowaniem, co oznacza, że możemy zaktualizować profil (na przykład dodając nowe urządzenia) zdalnie i mieć te zmiany wychwycone przez nasz serwer CI bez żadnych dodatkowych praca.

Uwaga: od tego czasu znalazłem sposób, aby zainstalować lub zaktualizować provisioning profil bez konieczności angażowania Xcode w ogóle-dużo czystsze! Zobacz tutaj aby uzyskać szczegółowe informacje.

 30
Author: jkp,
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-02-05 19:47:28

Profil provisioning musi być dostarczony przez UUID, w moim przypadku profile provisioning są sprawdzane w systemie kontroli źródła, a zatem są sprawdzane wraz z kodem przez system developer/build server / CI. W drzewie źródeł profile mają czytelne dla człowieka nazwy, takie jak MyApp.mobileprovison i znajdują się w katalogu o nazwie "ProvisioningProfiles". Aby utworzyć archiwum xcode, profile muszą zostać przemianowane i skopiowane do profili ~ / Library / MobileDevice/Provisioning katalog przed xcodebuild rozpozna je. Jest to fragment kodu, który może być użyty w skrypcie CI build.

# The keychain needs to be unlocked for signing, which requires the keychain
# password. This is stored in a file in the build account only accessible to
# the build account user
if [ ! -f $HOME/.pass ] ; then
    echo "no keychain password file available"
    exit 1
fi

case `stat -L -f "%p" $HOME/.pass`
in
    *400) ;;
    *)
        echo "keychain password file permissions are not restrictive enough"
        echo "chmod 400 $HOME/.pass"
        exit 1
        ;;
esac

#
# unlock the keychain, automatically lock keychain on script exit
#
security unlock-keychain -p `cat $HOME/.pass` $HOME/Library/Keychains/login.keychain
trap "security lock-keychain $HOME/Library/Keychains/login.keychain" EXIT

#
# Extract the profile UUID from the checked in Provisioning Profile.
#
uuid=`/usr/libexec/plistbuddy -c Print:UUID /dev/stdin <<< \
        \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``

#
# Copy the profile to the location XCode expects to find it and start the build,
# specifying which profile and signing identity to use for the archived app
#
cp -f ProvisioningProfiles/MyApp.mobileprovision \
        "$HOME/Library/MobileDevice/Provisioning Profiles/$uuid.mobileprovision"
xcodebuild -workspace MyApp.xcworkspace -scheme MyScheme \
        -archivePath build/MyApp.xcarchive archive \
        PROVISIONING_PROFILE="$uuid" CODE_SIGN_IDENTITY="iOS Distribution"

Pęk kluczy musi być odblokowany, a narzędzie"/usr/bin / codesign " musi mieć dostęp do klucza prywatnego związanego z tożsamością podpisywania, aby to zadziałało-użyto następujących odniesień https://stackoverflow.com/a/21327591/2351246 i Dodaj codesign do klucza prywatnego ACL bez pęku kluczy , aby odblokować i dodać dostęp do pęku kluczy dla codesign odpowiednio.

Jeśli archiwum ma być następnie wyeksportowane do IPA przy użyciu xcodebuild, należy wziąć pod uwagę następujący problem ( xcodebuild nie kopiuje pliku z .app ). Profil aprowizacji musi zostać ponownie dostarczony. Fragment skryptu do utworzenia IPA to

profileName=`/usr/libexec/plistbuddy -c Print:Name /dev/stdin <<< \
        \`security cms -D -i ProvisioningProfiles/MyApp.mobileprovision\``

xcodebuild \
        -exportArchive \
        -exportFormat IPA \
        -archivePath build/MyApp.xcarchive \
        -exportPath $IPADIR/MyApp.ipa \
        -exportProvisioningProfile "$profileName"

Pęk kluczy będzie musiał zostać odblokowany podczas uruchamiania tego polecenia.

UPDATE

Na OSX Mavericks (v10.9.5) i OSX Yosemite zaczęliśmy widzieć podpisywanie kodu błędy:

Codesign check fails : ...../MyApp.app: resource envelope is obsolete

Sprawdź ten post tutaj dla przyczyny xcodebuild-codesign-vvvv mówi "koperta zasobów jest przestarzała"

Aby zaimplementować zmianę sugerowaną przez obsługę Apple we wskazanym poście, uruchom następujące polecenie:

 sudo perl -pi.bak -e 's/--verify"./--verify", "--no-strict",/ if /codesign.*origApp/;' `xcrun -sdk iphoneos -f PackageApplication`
 21
Author: BitByteDog,
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 12:25:36

Zdaję sobie sprawę, że jest to prawdopodobnie trochę off temat OP, ale to pytanie pojawia się najpierw, gdy szuka jak uzyskać Xcode buduje działa na Jenkins. Zamieszczam tu dodatkowe informacje dla potomnych. I punkty. Jeśli uznałeś to za przydatne, podaj punkty:)

W każdym razie, ostatnio kilka razy oberwałem. Found this:

Http://code-dojo.blogspot.co.uk/2012/09/fix-ios-code-signing-issue-when-using.html

Wygląda na to, że działa. Marka pewnie:
  1. Konfiguracja Xcode jako zwykłego użytkownika OSX; get it building your distributable from there, fixing any provisioning profile issues through Xcode;

  2. Get the command line build working using xcodebuild, as a regular OSX user;

  3. Następnie postępuj zgodnie z instrukcjami w poście powyżej, kopiując wszystkie certy systemu iOS z pęku kluczy logowania do systemu i kopiując ~/Library/MobileDevice/Provisioning Profiles do pliku Użytkownika Jenkins ~jenkins/Library/MobileDevice/Provisioning Profiles folder.

Następna kompilacja Jenkinsa, używając poleceń z kroku 2 powyżej, powinna działać bez zarzutu.

 4
Author: Tim Fulmer,
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-11-16 23:27:36