Як можна відобразити версію версії програми в наборі налаштувань моєї програми?


91

Я хотів би включити версію програми та внутрішню версію, щось на зразок 1.0.1 (r1243), до набору налаштувань моєї програми.

Файл Root.plist містить такий фрагмент ...

     <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>

і я хотів би замінити рядок "VersionValue" під час побудови.

У мене є сценарій, який може витягти номер версії з мого сховища, мені потрібен спосіб обробити (попередньо обробити) файл Root.plist під час побудови та замінити номер редакції, не впливаючи на вихідний файл.

Відповіді:


69

Є ще одне рішення, яке може бути набагато простішим за будь-яку з попередніх відповідей. Apple поєднує інструмент командного рядка під назвою PlistBuddy всередині більшості своїх установників і включив його до Leopard на /usr/libexec/PlistBuddy.

Оскільки ви хочете замінити VersionValue, припускаючи, що ви отримали значення версії $newVersion, ви можете використовувати цю команду:

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

Не потрібно возитися з sed або регулярними виразами, цей підхід досить простий. Докладні інструкції див. На сторінці з інструкціями. Ви можете використовувати PlistBuddy, щоб додавати, видаляти або змінювати будь-який запис у списку властивостей. Наприклад, мій друг писав у блозі про збільшення номерів збірки в Xcode за допомогою PlistBuddy.

Примітка: Якщо ви вводите лише шлях до plist, PlistBuddy переходить у інтерактивний режим, тому ви можете видавати кілька команд, перш ніж приймати рішення про збереження змін. Я обов’язково рекомендую зробити це перед тим, як складати це у свій сценарій збірки.


20
Мені здається, трохи часу, щоб зрозуміти правильний спосіб посилання на номер версії у моєму plist; у моєму випадку це виявилось / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "встановити PreferenceSpecifiers: 0: DefaultValue $ newversion" - сподіваюся, це буде корисно для інших людей.
JosephH

Квін Тейлор, Джозеф, завдяки вашим відповідям, я зміг автоматично застосувати номер версії моїх програм у Settings.bundle. +1 для вас обох ;-)
Ніко

7
З нестандартної фази збірки "Запуск сценарію" мені потрібно було включити більше шляху до Root.plist: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Кріс Васселлі

2
Тільки для повноти, ось ще один підхід до PListBuddy, який працював у мене: xcodehelp.blogspot.com/2012/05/…
koen

найбільш правильний спосіб/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
камбала

66

Рішенням мого ледачого було оновлення номера версії з коду моєї програми. Ви можете мати значення за замовчуванням (або порожнє) у списку Root.plist, а потім десь у коді запуску:

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

Єдина фішка полягає в тому, що ваш додаток потрібно було б запустити принаймні один раз, щоб оновлена ​​версія з’явилася на панелі налаштувань.

Ви можете продовжити ідею і оновити, наприклад, лічильник кількості запусків вашого додатка або інші цікаві фрагменти інформації.


9
Це буде працювати, крім випадків, коли користувач переходить у Налаштування перед тим, як запускати програму.
Моше

9
@Moshe Правда, але, щоб обробити це елегантно, ви можете просто вказати значення за замовчуванням у файлі .plist, можливо щось на зразок "Ще не запущено"
Карлос П,

1
хоча більшість розробників , ймовірно , встановити CFBundleShortVersionStringі CFBundleVersionв той же значення, CFBundleShortVersionStringнасправді то , що компанія Apple хоче , щоб ви розглянути вашу випустили версію , яка була б то , що ви показуєте користувачам. CFBundleVersionпотенційно може бути внутрішнім номером версії, який ви, мабуть, не повинні показувати користувачам (якщо він відрізняється).
Nate

3
Мені чогось не вистачає? Це ТОЧНО те, що я роблю, але значення не змінюється. Ви, хлопці, не використовуєте властивість Title, яке, на мою думку, лише для читання?
samson

2
Також є інша проблема при оновленні програми. Пакет налаштувань все одно відображатиме стару версію збірки, поки оновлений додаток не буде запущено хоча б один раз.
Legoless

61

На основі відповіді @ Quinn, ось повний процес та робочий код, який я використовую для цього.

  • Додайте пакет налаштувань у свій додаток. Не перейменовуйте його.
  • Відкрийте Settings.bundle / Root.plist у текстовому редакторі

Замініть вміст на:

<?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>
  • Створіть фазу побудови сценарію запуску сценарію , перейдіть до фази копіювання пакетних ресурсів . Додайте цей код:

    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"
    
  • Замініть MyAppName на ім'я вашого фактичного додатка, а 1 після PreferenceSpecifiers буде індексом вашого запису про версію в налаштуваннях. У наведеному вище прикладі Root.plist він має індекс 1.


Я думаю, що це найкращий шлях
Тоні

Я спробував це, і бачу, як значення заголовка змінюється в моєму наборі налаштувань. Заголовок відображається у InAppSettingsKit, але значення не змінюється від початкової версії. Заголовок ніколи не відображається у програмі Налаштування. Я відмовляюся і просто збираюся відкрити діалогове вікно, коли користувач вибере в меню пункт "Про мене"
bugloaf

При використанні цього методу параметр не доступний лише для читання. тобто я можу торкнутися налаштування номера версії в settings.app, і це можна редагувати.
motionpotion

8
Баш-сценарій @ ben-clayton put для мене не спрацював, тому я переробляю його на основі його відповіді, ось він: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"
Луїс Аскорбе

1
Ви можете використовувати ${INFOPLIST_PATH}для шляху до інформаційного списку
Tomer Even

23

Використання списку Бена Клейтона https://stackoverflow.com/a/12842530/338986

Додати Run scriptз наступним фрагментом після 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"

Додаючи CFBundleVersionна додаток до CFBundleShortVersionString. Він видає таку версію:

Пишучи $CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist замість того, щоб $SRCROOTмати певні переваги.

  1. Це не змінює файли в робочій копії сховища.
  2. Вам не потрібно вводити шлях до Settings.bundlein $SRCROOT. Шлях може відрізнятися.

Тестування на Xcode 7.3.1


1
Це найкраща відповідь IMO, якщо ви додасте сценарій до розділу "Створення, попередні дії" схеми проекту. Подивіться на відповідь Енді.
Вахід Амірі,

2
Це працює для мене. Просто пам’ятайте, що слід змінити значення «DefaultValue» для вас. Наприклад, я хотів змінити нижній колонтитул, тому використав "FooterText". Вам також потрібно змінити число після "PreferenceSpecifiers", щоб воно відповідало елементу в списку.
Річард Візерспун,

12

На прикладі тут , ось сценарій я використовую для автоматичного оновлення параметрів пучка номера версії:

#! /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)

Ось список Root.pl, який я отримав у 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>

Дуже корисно - у мене виникають проблеми з виконанням PlistBuddy з Python, і я ніколи б не подумав про використання NSDictionary(і навіть не підозрював, що це дало вам такий простий доступ до файлів plist)
Дов,

Дякую за це. Одна модифікація - як у вас зараз, вона вносить зміни до джерела, а не до builddir - це означає, що те, що ви бачите на своєму пристрої або в симуляторі, завжди буде однією версією збірки за фактичною версією збірки. Щоб виправити це, я змінив ваш скрипт для перебору спочатку над джерелом, а потім і над builddir, тобто. settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod

... а також додаю гіташ:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
ксафод

8

Інші відповіді працюють некоректно з однієї причини: Фаза побудови сценарію запуску не виконується, доки ПІСЛЯ пакета налаштувань не буде упаковано. Отже, якщо ваша версія Info.plist - 2.0.11, і ви оновите її до 2.0.12, тоді побудуйте / заархівуйте свій проект, у наборі налаштувань все одно буде сказано 2.0.11. Якщо відкрити набір налаштувань Root.plist, ви побачите, що номер версії не оновлюється до кінця процесу збірки. Ви можете побудувати проект ЗНО, щоб правильно оновити пакет налаштувань, або ж замість цього можна додати сценарій до фази попередньої збірки ...

  • У XCode відредагуйте схему для цілі вашого проекту
  • Клацніть стрілку розкриття на схемі BUILD
  • Потім натисніть на пункт "Попередні дії"
  • Клацніть на знак плюса та виберіть "Нова дія сценарію запуску"
  • Встановіть для оболонки значення / bin / sh
  • Встановіть "Надати налаштування збірки з" для цілі вашого проекту
  • Додайте свій сценарій до текстової області. Для мене працював наступний сценарій. Можливо, вам доведеться змінити шляхи, щоб відповідати налаштуванням вашого проекту:

    versionString = $ (/ usr / libexec / PlistBuddy -c "Друк CFBundleVersion" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")

    / usr / libexec / PlistBuddy "$ SRCROOT / Settings.bundle / Root.plist" -c "встановити PreferenceSpecifiers: 0: DefaultValue $ versionString"

Це дозволить правильно запустити сценарій ДО того, як пакет налаштувань буде упакований під час процесу збірки / архівування. Якщо ви відкриєте набір налаштувань Root.plist і побудуєте / заархівуєте свій проект, ви побачите, що номер версії оновлено на початку процесу збірки, а ваш пакет налаштувань відобразить правильну версію.


Дякую, лише ваше рішення показує правильну версію збірки. Інші рішення потрібно будувати двічі.
Борис Ю.

Це все-таки вимагало для мене другої збірки, використовуючи Xcode 10.0
Патрік,

@Patrick Додаток для налаштувань iOS іноді зберігає стару інформацію. Щоб побачити зміни, вам потрібно вбити та перезапустити програму Налаштування.
Енді,

1
До речі, я знайшов простіший спосіб додати цей сценарій: перейдіть на вкладку "Фази збірки" цілі вашого проекту та натисніть піктограму "+". Виберіть "Нова фаза запуску сценарію" та додайте туди код сценарію. ЦЕ КЛЮЧ: клацніть та перетягніть новий сценарій запуску у верхній частині списку Фази побудови в розділі Цільові залежності, але перед джерелами компіляції. Це буде працювати так само, як сценарій попередньої збірки, і його легше знайти.
Енді,

Дякую @Andy, ваше рішення про додавання на вкладку "Фази збірки" спрацювало бездоганно.
Патрік

7

За допомогою Xcode 11.4 ви можете виконати такі дії, щоб відобразити версію програми в наборі налаштувань програми.


Набір $(MARKETING_VERSION)і $(CURRENT_PROJECT_VERSION)змінні

Примітка: якщо в $(MARKETING_VERSION)і. І Info$(CURRENT_PROJECT_VERSION) відображаються змінні для Bundle version string (short)і Bundle versionключів , ви можете пропустити наступні кроки та перейти до наступного розділу.

  1. Відкрийте проект Xcode.
  2. Відкрийте Навігатор проектів ( cmd1), виберіть свій проект, щоб розкрити налаштування проекту, а потім виберіть ціль програми.
  3. Виберіть вкладку Загальні .
  4. У розділі « Ідентичність» змініть вміст поля « Версія» на якесь нове значення (наприклад 0.1.0) і змініть вміст поля « Збірка» на якесь нове значення (наприклад 12). Ці 2 зміни створять $(MARKETING_VERSION)і $(CURRENT_PROJECT_VERSION)змінні у файлі Info.plist .

Створіть і налаштуйте пакет налаштувань

  1. У проекті Навігатор виберіть свій проект.
  2. Виберіть Файл > Створити > Файл ... (cmdN ).
  3. Виберіть iOS вкладку .
  4. Виберіть Набір налаштувань у розділі Ресурс , потім натисніть Далі та Створити .
  5. Виберіть Root.plist і відкрийте його як вихідний код. Замініть його вміст кодом нижче:
<?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>

Додайте сценарій запуску

  1. У Навігаторі проектів виберіть свій проект.
  2. Виберіть ціль програми.
  3. Виберіть Фази побудови вкладку .
  4. Клацніть + > Нова сценарія запуску сценарію .
  5. Перетягніть нову фазу десь вище Копіювати ресурси ресурсу розділом . Таким чином, сценарій буде виконаний перед компіляцією програми.
  6. Відкрийте нещодавно додану фазу запуску сценарію та додайте такий сценарій:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Запуск програми

  1. Запустіть продукт (cmdR ) на пристрої або тренажері.
  2. На пристрої або симуляторі після запуску програми відкрийте програму Налаштування та виберіть свою програму у списку сторонніх програм. Версія програми повинна відображатися, як показано нижче:


Джерела


Це викликає помилку для менеSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H,

2
Це спрацювало для мене:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Йорданія H

Дякую. Це який світ для мене. Але мою назвали Settings-Watch.bundle і видалили($build)
Kurt Lane

3

Мені вдалося зробити те, що я хотів, використовуючи pListcompiler ( http://sourceforge.net/projects/plistcompiler ) з відкритим вихідним кодом.

  1. За допомогою цього компілятора ви можете записати файл властивостей у файл .plc у наступному форматі:

    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. У мене була спеціальна фаза побудови сценарію запуску, яка витягувала мою ревізію сховища у файл .h, як описано тут brad-larson .

  3. Файл plc може містити директиви препроцесора, такі як #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, змінні середовища xcode. Тож я зміг звернутися до змінної kRevisionNumber, додавши наступну директиву

    #include "Revision.h"
    
  4. Я також додав спеціальну фазу побудови сценарію до моєї цілі xcode для запуску plcompiler кожного разу, коли проект будує збірку

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

І це було все!


Це звучить як багато роботи, щоб просто замінити одне значення у файлі plist ... Концептуально класно мати можливість отримати доступ до змінної при побудові plist, але набагато простіше використовувати інструмент для побудови файлу plist. Я описую PlistBuddy у своїй відповіді - спробуйте!
Quinn Taylor

3

Мій робочий приклад, заснований на відповіді @Ben Clayton та коментарях @Luis Ascorbe та @Vahid Amiri:

Примітка: Цей підхід змінює файл Settings.bundle / Root.plist у робочій копії сховища

  1. Додайте пакет налаштувань до кореня проекту. Не перейменовуйте його

  2. Відкрийте Settings.bundle / Root.plist як SourceCode

    Замініть вміст на:

    <?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. Додайте наступний сценарій до розділу «Збірка, попередні дії» схеми проекту (цільової)

    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. Створіть та запустіть поточну схему


2

Наведені вище відповіді для мене не працювали, отже, я створив власний сценарій.

Це динамічно оновлює запис із Root.plist

Використовуйте сценарій запуску нижче. Погана робота точно перевірена в xcode 10.3.

"var buildVersion" - це версія, яка відображатиметься в заголовку.

І назва ідентифікатора - "версія варіанта" нижче для заголовка в 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

Приклад запису в 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>

Робочий зразок запису Root.plist


1

Я вважаю, що ви можете зробити це способом, подібним до того, що я описую у цій відповіді (на основі цього допису ).

По-перше, ви можете зробити VersionValue змінною в Xcode, перейменувавши її в $ {VERSIONVALUE}. Створіть файл з назвою versionvalue.xcconfig і додайте його до свого проекту. Перейдіть до цільової програми та перейдіть до налаштувань збірки для цієї цілі. Я вважаю, що вам потрібно додати VERSIONVALUE як визначений користувачем параметр побудови. У нижньому правому куті цього вікна змініть значення На основі значення на "versionvalue".

Нарешті, перейдіть до своєї цілі та створіть етап запуску сценарію запуску. Перевірте фазу запуску сценарію та вставте свій сценарій у текстове поле сценарію. Наприклад, мій скрипт для позначення мого параметра BUILD_NUMBER поточною збіркою Subversion має такий вигляд:

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

Це повинно зробити фокус заміни змінної, коли ці значення змінюються у вашому проекті.


Це працює, якщо я хочу вставити номер версії у файл Info.plist. Але я не можу змусити це працювати для інших файлів plist, наприклад, для файлу Root.plist, який знаходиться в Settings.bundle. Чи є параметр збірки, за допомогою якого я можу це ввімкнути?
Панайотис Коррос

0

Для мене це було найпростішим рішенням:

Додайте новий етап створення сценарію перед кроком Копіювати ресурси ресурсу

Оболонка: /usr/bin/env python

Зміст:

#! /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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.