Jak mogę wyświetlić wersję wersji aplikacji w pakiecie ustawień mojej aplikacji?

91

Chciałbym dołączyć wersję aplikacji i wewnętrzną rewizję, np. 1.0.1 (r1243), do pakietu ustawień mojej aplikacji.

Plik Root.plist zawiera taki fragment ...

     <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>Key</key>
        <string>version_preference</string>
        <key>DefaultValue</key>
        <string>VersionValue</string>
        <key>Values</key>
        <array>
            <string>VersionValue</string>
        </array>
        <key>Titles</key>
        <array>
            <string>VersionValue</string>
        </array>
    </dict>

i chciałbym zastąpić ciąg „VersionValue” w czasie kompilacji.

Mam skrypt, który może wyodrębnić numer wersji z mojego repozytorium, potrzebuję sposobu na przetworzenie (wstępne przetworzenie) pliku Root.plist w czasie kompilacji i zastąpienie numeru wersji bez wpływu na plik źródłowy.

Panagiotis Korros
źródło

Odpowiedzi:

69

Istnieje inne rozwiązanie, które może być znacznie prostsze niż którakolwiek z poprzednich odpowiedzi. Apple dołącza narzędzie wiersza poleceń o nazwie PlistBuddy do większości swoich instalatorów i umieściło je w Leopardzie pod adresem /usr/libexec/PlistBuddy.

Ponieważ chcesz zamienić VersionValue, zakładając, że masz wyodrębnioną wartość wersji $newVersion, możesz użyć tego polecenia:

/usr/libexec/PlistBuddy -c "Set :VersionValue $newVersion" /path/to/Root.plist

Nie ma potrzeby majstrowania przy sedzie czy wyrażeniach regularnych, to podejście jest całkiem proste. Zobacz stronę podręcznika, aby uzyskać szczegółowe instrukcje. Możesz użyć PlistBuddy, aby dodać, usunąć lub zmodyfikować dowolny wpis na liście właściwości. Na przykład mój przyjaciel napisał na blogu o zwiększaniu numerów kompilacji w Xcode przy użyciu PlistBuddy.

Uwaga: Jeśli podasz tylko ścieżkę do pliku plist, PlistBuddy przejdzie w tryb interaktywny, więc możesz wydać wiele poleceń przed podjęciem decyzji o zapisaniu zmian. Zdecydowanie zalecam zrobienie tego przed umieszczeniem go w skrypcie kompilacji.

Quinn Taylor
źródło
20
Chwilę zastanawiam się, jak odnieść się do numeru wersji w moim pliku plist; w moim przypadku okazało się, że jest to / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" - mam nadzieję, że przyda się innym.
JosephH,
Quinn Taylor, JosephH, dzięki Twoim odpowiedziom mogłem automatycznie zaimplementować numer wersji moich aplikacji w pakiecie Settings.bundle. +1 dla Was obojga ;-)
Niko
7
Z fazy budowania niestandardowego „Run Script” musiałem dołączyć więcej ścieżki do Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Chris Vasselli
2
Dla kompletności, oto inne podejście do PListBuddy, które zadziałało dla mnie: xcodehelp.blogspot.com/2012/05/…
koen
najbardziej poprawnym sposobem jest/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala
66

Rozwiązaniem mojego leniwca było zaktualizowanie numeru wersji z kodu mojej aplikacji. Możesz mieć domyślną (lub pustą) wartość w Root.plist, a następnie gdzieś w kodzie startowym:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
[[NSUserDefaults standardUserDefaults] setObject:version forKey:@"version_preference"];

Jedyny haczyk polega na tym, że Twoja aplikacja musiałaby zostać uruchomiona co najmniej raz, aby zaktualizowana wersja pojawiła się w panelu ustawień.

Możesz pójść dalej i zaktualizować na przykład licznik, ile razy Twoja aplikacja została uruchomiona, lub inne interesujące informacje.


źródło
9
To zadziała, chyba że użytkownik przejdzie do Ustawień przed uruchomieniem aplikacji.
Moshe
9
@Moshe True, ale aby poradzić sobie z tym elegancko, możesz po prostu określić wartość domyślną w pliku .plist, być może coś w rodzaju „Jeszcze nie uruchomiono”
Carlos P
1
chociaż większość deweloperów prawdopodobnie ustawiony CFBundleShortVersionStringi CFBundleVersionna taką samą wartość, CFBundleShortVersionStringto rzeczywiście to, co Apple chce, aby rozważyć swoją wydaną wersję , która byłaby co pokazują użytkowników. CFBundleVersionmoże potencjalnie być wewnętrznym numerem wersji, którego prawdopodobnie nie powinieneś pokazywać użytkownikom (jeśli jest inny).
Nate,
3
Czy coś mi brakuje? To DOKŁADNIE to, co robię, ale wartość nie ulega zmianie. Czy nie używacie właściwości tytułu, która moim zdaniem jest tylko do odczytu?
samson
2
Jest też inny problem podczas aktualizacji aplikacji. Pakiet ustawień nadal wyświetlałby starą wersję kompilacji, dopóki zaktualizowana aplikacja nie zostanie uruchomiona przynajmniej raz.
Bezprawny
61

W oparciu o odpowiedź @ Quinn, oto pełny proces i działający kod, którego używam do tego.

  • Dodaj pakiet ustawień do swojej aplikacji. Nie zmieniaj jej nazwy.
  • Otwórz Settings.bundle / Root.plist w edytorze tekstu

Zastąp zawartość:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"     "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>DummyVersion</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>
  • Utwórz fazę kompilacji Run Script , przejdź do fazy Copy Bundle Resources . Dodaj ten kod:

    cd "${BUILT_PRODUCTS_DIR}"
    buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}" )
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $buildVersion" "${WRAPPER_NAME}/Settings.bundle/Root.plist"
    
  • Zastąp MyAppName rzeczywistą nazwą aplikacji i 1 po PreferenceSpecifiers, aby być indeksem wpisu wersji w Ustawieniach. Powyższy przykład Root.plist ma go pod indeksem 1.

Ben Clayton
źródło
Myślę, że to najlepszy sposób
Tony
Próbowałem tego i widzę, że wartość tytułu zmienia się w moim pakiecie ustawień. Tytuł pojawia się w InAppSettingsKit, ale wartość nie zmienia się od wersji początkowej. Tytuł nigdy nie pojawia się w aplikacji Ustawienia.
Poddaję
W przypadku korzystania z tej metody ustawienie nie jest tylko do odczytu. tj. mogę skorzystać z ustawienia numeru wersji w settings.app i można go edytować.
motionpotion,
8
Skrypt basha, który umieścił @ ben-clayton, nie działał dla mnie, więc przerabiam go na podstawie jego odpowiedzi, oto jest:buildVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "${PROJECT_DIR}/${INFOPLIST_FILE}") /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:3:DefaultValue $buildVersion" "${SRCROOT}/Settings.bundle/Root.plist"
Luis Ascorbe
1
możesz użyć ${INFOPLIST_PATH}do ścieżki informacji plist
Tomer Even
23

Korzystanie z plist Bena Claytona https://stackoverflow.com/a/12842530/338986

Dodaj Run scriptz następującym fragmentem po Copy Bundle Resources.

version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:1:DefaultValue $version ($build)" "$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist"

Dołączanie CFBundleVersiondodatkowo CFBundleShortVersionString. Emituje wersję następującą:

Pisząc do $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist zamiast tego w $SRCROOTma pewne korzyści.

  1. Nie modyfikuje plików w kopii roboczej repozytorium.
  2. Nie trzeba do sprawy ścieżkę Settings.bundlew $SRCROOT. Ścieżka może się różnić.

Testowanie na Xcode 7.3.1

hiroshi
źródło
1
To najlepsza odpowiedź IMO, jeśli dodasz skrypt do sekcji Build, Pre-Actions schematu projektu. Spójrz na odpowiedź Andy'ego.
Vahid Amiri,
2
To działa dla mnie. Pamiętaj tylko, aby zmienić wartość „DefaultValue”, aby była specyficzna dla Ciebie. Na przykład chciałem zmienić stopkę, więc użyłem „FooterText”. Musisz również zmienić liczbę po „PreferenceSpecifiers”, aby była skorelowana z pozycją w plist.
Richard Witherspoon
12

Opierając się na przykład tutaj , oto skrypt używam, aby automatycznie aktualizować ustawienia wiązki numer wersji:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

settings_file_path = 'Settings.bundle/Root.plist' # the relative path from the project folder to your settings bundle
settings_key = 'version_preference' # the key of your settings version

# these are used for testing only
info_path = '/Users/mrwalker/developer/My_App/Info.plist'
settings_path = '/Users/mrwalker/developer/My_App/Settings.bundle/Root.plist'

# these environment variables are set in the XCode build phase
if 'PRODUCT_SETTINGS_PATH' in os.environ.keys():
    info_path = os.environ.get('PRODUCT_SETTINGS_PATH')

if 'PROJECT_DIR' in os.environ.keys():
    settings_path = os.path.join(os.environ.get('PROJECT_DIR'), settings_file_path)

# reading info.plist file
project_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(info_path)
project_bundle_version = project_plist['CFBundleVersion']

# print 'project_bundle_version: '+project_bundle_version

# reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
  for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = project_bundle_version

# print repr(settings_plist)
settings_plist.writeToFile_atomically_(settings_path, True)

Oto lista Root.plist, którą mam w Settings.bundle:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>Title</key>
            <string>About</string>
            <key>Type</key>
            <string>PSGroupSpecifier</string>
        </dict>
        <dict>
            <key>DefaultValue</key>
            <string>1.0.0.0</string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>
mrwalker
źródło
Bardzo przydatne - mam problem z uruchomieniem PlistBuddy z Pythona i nigdy bym nie pomyślał o używaniu NSDictionary(i nie zdawałem sobie sprawy, że daje to tak łatwy dostęp do plików plist)
Dov
Dziękuję Ci za to. Jedna modyfikacja - tak jak teraz, powoduje zmianę źródła, a nie builddir - co oznacza, że ​​to, co widzisz na swoim urządzeniu lub w symulatorze, będzie zawsze jedną wersją kompilacji za rzeczywistą wersją kompilacji. Aby to naprawić, zmodyfikowałem twój skrypt, aby iterował najpierw po źródle, a potem także po builddir, tj. settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod
... a także dołączam githash:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod
8

Inne odpowiedzi nie działają poprawnie z jednego powodu: Faza kompilacji skryptu uruchamiania nie jest wykonywana, dopóki nie zostanie spakowany pakiet ustawień. Tak więc, jeśli twoja wersja Info.plist to 2.0.11 i zaktualizujesz ją do 2.0.12, a następnie skompiluj / zarchiwizuj swój projekt, pakiet ustawień nadal będzie zawierał 2.0.11. Jeśli otworzysz pakiet ustawień Root.plist, zobaczysz, że numer wersji nie zostanie zaktualizowany do zakończenia procesu kompilacji. Możesz skompilować projekt PONOWNIE, aby pakiet ustawień został poprawnie zaktualizowany, lub możesz zamiast tego dodać skrypt do fazy przed kompilacją ...

  • W XCode Edytuj schemat dla celu projektu
  • Kliknij strzałkę ujawnienia w schemacie BUILD
  • Następnie kliknij element „Działania wstępne”
  • Kliknij znak plus i wybierz „Nowa akcja skryptu uruchamiania”
  • Ustaw wartość powłoki na / bin / sh
  • Ustaw „Podaj ustawienia kompilacji z” na cel projektu
  • Dodaj swój skrypt do pola tekstowego. Poniższy skrypt zadziałał dla mnie. Może zajść potrzeba zmodyfikowania ścieżek, aby pasowały do ​​konfiguracji projektu:

    versionString = $ (/ usr / libexec / PlistBuddy -c "Print CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "set PreferenceSpecifiers: 0: DefaultValue $ versionString"

Spowoduje to prawidłowe uruchomienie skryptu PRZED pakowaniem pakietu ustawień podczas procesu budowania / archiwizacji. Jeśli otworzysz pakiet ustawień Root.plist i skompilujesz / zarchiwizujesz swój projekt, zobaczysz teraz, że numer wersji jest aktualizowany na początku procesu kompilacji, a pakiet ustawień wyświetli poprawną wersję.

Andy
źródło
Dziękuję, tylko Twoje rozwiązanie pokazuje poprawną wersję kompilacji. Inne rozwiązania wymagane do dwukrotnej budowy.
Boris Y.
To nadal wymagało drugiej kompilacji, używając Xcode 10.0
Patrick,
@Patrick Aplikacja ustawień iOS czasami zachowuje stare informacje. Aby zobaczyć zmianę, musisz zabić i ponownie uruchomić aplikację Ustawienia.
Andy
1
BTW, znalazłem prostszy sposób dodania tego skryptu: Przejdź do zakładki Fazy budowania celu projektu i kliknij ikonę „+”. Wybierz „New Run Script Phase” i dodaj tam kod skryptu. TO JEST KLUCZ: kliknij i przeciągnij nowy skrypt uruchamiania na górę listy Fazy kompilacji, w obszarze Zależności docelowe, ale przed Źródłami kompilacji. Będzie to zachowywać się tak samo jak skrypt przed kompilacją i będzie łatwiejsze do znalezienia.
Andy
Dzięki @Andy, Twoje rozwiązanie polegające na dodaniu do karty Fazy kompilacji zadziałało idealnie.
Patrick
7

W przypadku Xcode 11.4 możesz wykonać następujące kroki, aby wyświetlić wersję aplikacji w pakiecie ustawień aplikacji.


Zbiór $(MARKETING_VERSION)i $(CURRENT_PROJECT_VERSION)zmienne

Uwaga: jeśli zmienne $(MARKETING_VERSION)i $(CURRENT_PROJECT_VERSION)pojawiają się dla kluczy Bundle version string (short)i Bundle versionw Info.plist , możesz pominąć następujące kroki i przejść do następnej sekcji.

  1. Otwórz projekt Xcode.
  2. Otwórz Nawigatora projektu ( cmd1), wybierz swój projekt, aby wyświetlić ustawienia projektu, a następnie wybierz cel aplikacji.
  3. Wybierz kartę Ogólne .
  4. W sekcji Tożsamość zmień zawartość pola Wersja na jakąś nową wartość (np. 0.1.0) I zmień zawartość pola Kompilacja na jakąś nową wartość (np 12.). Te 2 zmiany będą tworzyć $(MARKETING_VERSION)i $(CURRENT_PROJECT_VERSION)zmienne w Info.plist pliku.

Utwórz i skonfiguruj pakiet ustawień

  1. W Nawigatorze projektu wybierz swój projekt.
  2. Wybierz Plik > Nowy > Plik… ( cmdN).
  3. Wybierz kartę iOS .
  4. Wybierz opcję Pakiet ustawień w sekcji Zasoby , a następnie kliknij przycisk Dalej i Utwórz .
  5. Wybierz Root.plist i otwórz go jako kod źródłowy. Zastąp jego zawartość poniższym kodem:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PreferenceSpecifiers</key>
    <array>
        <dict>
            <key>DefaultValue</key>
            <string></string>
            <key>Key</key>
            <string>version_preference</string>
            <key>Title</key>
            <string>Version</string>
            <key>Type</key>
            <string>PSTitleValueSpecifier</string>
        </dict>
    </array>
    <key>StringsTable</key>
    <string>Root</string>
</dict>
</plist>

Dodaj skrypt uruchamiania

  1. W Nawigatorze projektu wybierz swój projekt.
  2. Wybierz miejsce docelowe aplikacji.
  3. Wybierz fazy budowy kartę .
  4. Kliknij + > Nowa faza skryptu uruchamiania .
  5. Przeciągnij i upuść nową fazę gdzieś powyżej Kopiuj zasoby pakietu sekcji . W ten sposób skrypt zostanie wykonany przed kompilacją aplikacji.
  6. Otwórz nowo dodaną fazę Run Script i dodaj następujący skrypt:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Uruchom aplikację

  1. Uruchom produkt (cmdR ) na urządzeniu lub w symulatorze.
  2. Na urządzeniu lub symulatorze po uruchomieniu aplikacji otwórz aplikację Ustawienia i wybierz swoją aplikację z listy aplikacji innych firm. Wersja aplikacji powinna zostać wyświetlona, ​​jak pokazano poniżej:


Źródła

Imanou Petit
źródło
To generuje dla mnie błądSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H
2
To zadziałało dla mnie:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H
Dzięki. To jaki świat dla mnie. Ale mój nazywał się Settings-Watch.bundle i usunął($build)
Kurt Lane
3

Udało mi się zrobić to, co chciałem, używając porject open source pListcompiler ( http://sourceforge.net/projects/plistcompiler ).

  1. Za pomocą tego kompilatora możesz zapisać plik właściwości w pliku .plc w następującym formacie:

    plist {
        dictionary {
            key "StringsTable" value string "Root"
            key "PreferenceSpecifiers" value array [
                dictionary {
                    key "Type" value string "PSGroupSpecifier"
                    key "Title" value string "AboutSection"
                }
                dictionary {
                    key "Type" value string "PSTitleValueSpecifier"
                    key "Title" value string "Version"
                    key "Key" value string "version"
                    key "DefaultValue" value string "VersionValue"
                    key "Values" value array [
                        string "VersionValue"
                    ]
                    key "Titles" value array [
                        string "r" kRevisionNumber
                    ]
                }
            ]
        }
    }
    
  2. Miałem fazę budowania niestandardowego skryptu uruchamiania, która polegała na wyodrębnianiu mojej wersji repozytorium do pliku .h, jak opisał tutaj Brad-Larson .

  3. Plik plc może zawierać dyrektywy preprocesora, takie jak #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, zmienne środowiskowe xcode. Więc mogłem odwołać się do zmiennej kRvisionNumber, dodając następującą dyrektywę

    #include "Revision.h"
    
  4. Dodałem również fazę kompilacji skryptu niestandardowego do mojego celu xcode, aby uruchamiać plcompiler za każdym razem, gdy projekt jest budowany

    /usr/local/plistcompiler0.6/plcompile -dest Settings.bundle -o Root.plist Settings.plc
    

I to było to!

Panagiotis Korros
źródło
To brzmi jak dużo pracy, aby zastąpić pojedynczą wartość w pliku plist ... Koncepcyjnie fajnie jest mieć dostęp do zmiennej podczas budowania plist, ale znacznie łatwiej jest użyć kompilacji narzędzia dla pliku plist. PlistBuddy opisuję w mojej odpowiedzi - spróbuj!
Quinn Taylor
3

Mój przykład roboczy oparty na odpowiedzi @Ben Clayton i komentarzach @Luis Ascorbe i @Vahid Amiri:

Uwaga: To podejście modyfikuje plik Settings.bundle / Root.plist w kopii roboczej repozytorium

  1. Dodaj pakiet ustawień do katalogu głównego projektu. Nie zmieniaj jej nazwy

  2. Otwórz Settings.bundle / Root.plist jako SourceCode

    Zastąp zawartość:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
    <dict>
        <key>PreferenceSpecifiers</key>
        <array>
            <dict>
                <key>DefaultValue</key>
                <string></string>
                <key>Key</key>
                <string>version_preference</string>
                <key>Title</key>
                <string>Version</string>
                <key>Type</key>
                <string>PSTitleValueSpecifier</string>
            </dict>
        </array>
        <key>StringsTable</key>
        <string>Root</string>
    </dict>
    </plist>
    
  3. Dodaj następujący skrypt do sekcji Kompiluj, Działania wstępne schematu projektu (celu)

    version=$(/usr/libexec/PlistBuddy -c "Print CFBundleShortVersionString" "$PROJECT_DIR/$INFOPLIST_FILE")
    build=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$PROJECT_DIR/$INFOPLIST_FILE")
    
    /usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"
    
  4. Zbuduj i uruchom bieżący schemat

Peter Kreinz
źródło
2

Powyższe odpowiedzi nie zadziałały, dlatego stworzyłem własny skrypt.

To dynamicznie aktualizuje wpis z Root.plist

Użyj skryptu uruchamiania poniżej. Na pewno będzie działać zweryfikowany w Xcode 10.3.

„var buildVersion” to wersja, która ma być wyświetlana w tytule.

A nazwa identyfikatora to „wersja zmienna” poniżej dla tytułu w settings.bundle Root.plist

cd "${BUILT_PRODUCTS_DIR}"

#set version name to your title identifier's string from settings.bundle
var version = "Version"

#this will be the text displayed in title
longVersion=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "${INFOPLIST_PATH}")
shortVersion=$(/usr/libexec/PlistBuddy -c "Print :CFBundleShortVersionString" ${TARGET_BUILD_DIR}/${INFOPLIST_PATH})
buildVersion="$shortVersion.$longVersion"

path="${WRAPPER_NAME}/Settings.bundle/Root.plist"

settingsCnt=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:" ${path} | grep "Dict"|wc -l`

for (( idx=0; idx<$settingsCnt; idx++ ))
do
#echo "Welcome $idx times"
val=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:Key" ${path}`
#echo $val

#if ( "$val" == "Version" )
if [ $val == "Version" ]
then
#echo "the index of the entry whose 'Key' is 'version' is $idx."

# now set it
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:${idx}:DefaultValue $buildVersion" $path

# just to be sure that it worked
ver=`/usr/libexec/PlistBuddy -c "Print PreferenceSpecifiers:${idx}:DefaultValue" $path`
#echo 'PreferenceSpecifiers:$idx:DefaultValue set to: ' $ver

fi

done

Przykładowy wpis w Root.plist

    <dict>
        <key>Type</key>
        <string>PSTitleValueSpecifier</string>
        <key>Title</key>
        <string>Version</string>
        <key>DefaultValue</key>
        <string>We Rock</string>
        <key>Key</key>
        <string>Version</string>
    </dict>

Działający przykładowy wpis Root.plist

dheeraj_jha
źródło
1

Uważam, że możesz to zrobić w sposób podobny do tego, co opisuję w tej odpowiedzi (na podstawie tego postu ).

Po pierwsze, możesz ustawić VersionValue jako zmienną w Xcode, zmieniając jej nazwę na $ {VERSIONVALUE}. Utwórz plik o nazwie versionvalue.xcconfig i dodaj go do swojego projektu. Przejdź do celu aplikacji i przejdź do ustawień kompilacji dla tego celu. Uważam, że musisz dodać VERSIONVALUE jako ustawienie kompilacji zdefiniowane przez użytkownika. W prawym dolnym rogu tego okna zmień wartość Na podstawie na „versionvalue”.

Na koniec przejdź do celu i utwórz fazę kompilacji Run Script. Sprawdź tę fazę Uruchom skrypt i wklej skrypt w polu tekstowym Skrypt. Na przykład mój skrypt oznaczający moje ustawienie BUILD_NUMBER bieżącą kompilacją Subversion wygląda następująco:

REV=`/usr/bin/svnversion -nc ${PROJECT_DIR} | /usr/bin/sed -e 's/^[^:]*://;s/[A-Za-z]//'`
echo "BUILD_NUMBER = $REV" > ${PROJECT_DIR}/buildnumber.xcconfig

Powinno to załatwić sprawę polegającą na zastąpieniu zmiennej, gdy te wartości zmienią się w projekcie.

Brad Larson
źródło
Działa to, jeśli chcę osadzić numer wersji w pliku Info.plist. Ale nie mogę sprawić, by działało z innymi plikami plist, na przykład plikiem Root.plist, który znajduje się w pliku Settings.bundle. Czy istnieje ustawienie kompilacji, którego mogę użyć, aby to włączyć?
Panagiotis Korros
0

Dla mnie to było najłatwiejsze rozwiązanie:

Dodaj nową fazę kompilacji skryptu przed krokiem Kopiuj zasoby pakietu

Muszla: /usr/bin/env python

Zadowolony:

#! /usr/bin/env python
import os
from AppKit import NSMutableDictionary

# Key to replace
settings_key = 'version_preference' # the key of your settings version

# File path
settings_path = os.environ.get('SRCROOT') + "/TheBeautifulNameOfYourOwnApp/Settings.bundle/Root.plist"

# Composing version string
version_string = os.environ.get('MARKETING_VERSION') + " (" + os.environ.get('CURRENT_PROJECT_VERSION') + ")"

# Reading settings plist
settings_plist = NSMutableDictionary.dictionaryWithContentsOfFile_(settings_path)
for dictionary in settings_plist['PreferenceSpecifiers']:
    if 'Key' in dictionary and dictionary['Key'] == settings_key:
        dictionary['DefaultValue'] = version_string

# Save new settings
settings_plist.writeToFile_atomically_(settings_path, True)
gklka
źródło