Uygulama sürümü revizyonunu uygulamamın ayarlar paketinde nasıl görüntüleyebilirim?


91

1.0.1 (r1243) gibi uygulama sürümünü ve dahili revizyonu uygulamamın ayarlar paketine dahil etmek istiyorum.

Root.plist dosyası bunun gibi bir parça içerir ...

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

ve derleme zamanında "VersionValue" dizesini değiştirmek istiyorum.

Sürüm numarasını depomdan çıkarabilen bir komut dosyam var, ihtiyacım olan şey, derleme zamanında Root.plist dosyasını işlemek (önceden işlemek) ve kaynak dosyayı etkilemeden revizyon numarasını değiştirmek.

Yanıtlar:


69

Önceki cevaplardan çok daha basit olabilecek başka bir çözüm var. Apple , yükleyicilerinin çoğunun içinde PlistBuddy adlı bir komut satırı aracı paketler ve bunu Leopard'a dahil etmiştir /usr/libexec/PlistBuddy.

Değiştirmek istediğinizden VersionValue, sürüm değerinin çıkarıldığını varsayarak $newVersion, şu komutu kullanabilirsiniz:

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

Sed veya normal ifadelerle oynamaya gerek yok, bu yaklaşım oldukça basittir. Ayrıntılı talimatlar için man sayfasına bakın . Bir özellik listesindeki herhangi bir girişi eklemek, kaldırmak veya değiştirmek için PlistBuddy'yi kullanabilirsiniz. Örneğin, bir arkadaşım PlistBuddy kullanarak Xcode'da derleme sayılarının artırılması hakkında blog yazdı .

Not: Yalnızca pliste giden yolu sağlarsanız, PlistBuddy etkileşimli moda girer, böylece değişiklikleri kaydetmeye karar vermeden önce birden fazla komut verebilirsiniz. Bunu derleme betiğinize eklemeden önce kesinlikle tavsiye ederim.


20
Plistimdeki sürüm numarasına atıfta bulunmanın doğru yolunu bulmam biraz zaman alıyor; benim durumumda / usr / libexec / PlistBuddy Settings.bundle / Root.plist -c "set PreferenceSpecifiers: 0: DefaultValue $ newversion" olduğu ortaya çıktı - umarım bu diğer insanlar için yararlı olacaktır.
JosephH

Quinn Taylor, JosephH, cevaplarınız sayesinde, Ayarlar.bundle'da uygulamalarımın sürüm numarasını otomatik olarak uygulayabildim. İkiniz için +1 ;-)
Niko

7
Özel bir "Komut Dosyası Çalıştır" oluşturma aşamasından, Root.plist'e giden yolun daha fazlasını eklemem gerekiyordu: / usr / libexec / PlistBuddy $ {TARGET_BUILD_DIR} / $ {FULL_PRODUCT_NAME} /Settings.bundle/Root.plist -c "kümesi PreferenceSpecifiers: 0: DefaultValue $ newVersion "
Chris Vasselli

2
Tamlık adına, işte benim için işe yarayan PListBuddy ile başka bir yaklaşım: xcodehelp.blogspot.com/2012/05/…
koen

en doğru yol/usr/libexec/PlistBuddy -c "Set :PreferenceSpecifiers:0:DefaultValue ${newVersion}" "${TARGET_BUILD_DIR}/${CONTENTS_FOLDER_PATH}/Settings.bundle/Root.plist"
kambala

66

Tembel adamımın çözümü, sürüm numarasını uygulama kodumdan güncellemekti. Root.plist ve ardından başlangıç ​​kodunuzda bir yerde varsayılan (veya boş) bir değere sahip olabilirsiniz:

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

Tek sorun, güncellenmiş sürümün ayarlar panelinde görünmesi için uygulamanızın en az bir kez çalıştırılması gerektiğidir.

Bu fikri daha ileriye taşıyabilir ve örneğin, uygulamanızın kaç kez başlatıldığını gösteren bir sayaç veya diğer ilginç bilgileri güncelleyebilirsiniz.


9
Bu, kullanıcının uygulamanızı başlatmadan önce Ayarlar'a girmesi dışında işe yarar .
Moshe

9
@Moshe True, ancak bunu zarif bir şekilde ele almak için, .plist dosyasında bir Varsayılan Değer belirtebilirsiniz, belki de 'Henüz Başlatılmadı' gibi bir şey
Carlos P

1
çoğu geliştirici muhtemelen set rağmen CFBundleShortVersionStringve CFBundleVersionaynı değere, CFBundleShortVersionStringaslında ne Apple size dikkate almak istiyor yayımlanan sürümünü kullanıcılara göstermek neyi olurdu. CFBundleVersionmuhtemelen kullanıcılara göstermemeniz gereken dahili bir sürüm numarası olabilir (eğer farklıysa).
Nate

3
Bir şey mi kaçırıyorum? Bu TAMAMEN yaptığım şey ama değer değişmiyor. Sadece okunur olduğuna inandığım bir Başlık özelliğini kullanmıyor musunuz?
samson

2
Uygulamayı güncellerken başka bir sorun da var. Ayarlar paketi, güncellenen uygulama en az bir kez başlatılana kadar eski yapı sürümünü görüntülemeye devam edecektir.
Legoless

61

@ Quinn'in cevabına dayanarak, işte tam işlem ve bunu yapmak için kullandığım çalışma kodu.

  • Uygulamanıza bir ayar paketi ekleyin. Yeniden adlandırmayın.
  • Bir metin düzenleyicide Settings.bundle / Root.plist'i açın

İçeriği şununla değiştirin:

<?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>
  • Bir Çalıştırma Komut Dosyası oluşturma aşaması oluşturun, Paket Kaynaklarını Kopyalama aşamasından sonra olun . Bu kodu ekleyin:

    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 yerine gerçek uygulamanızın adını ve 1 after PreferenceSpecifiers'ı Ayarlar'daki Sürüm girişinizin dizini olacak şekilde değiştirin. Yukarıdaki Root.plist örneğinde, dizin 1'de bulunur.


Bence gitmenin en iyi yolu bu
Tony

Bunu denedim ve ayarlar paketimde Başlık değerinin değiştiğini görüyorum. Başlık InAppSettingsKit'te görünür, ancak değer ilk sürümden değişmez. Başlık, Ayarlar uygulamasında asla görünmez.
Vazgeçiyorum

Bu yöntemi kullanırken ayar salt okunur değildir. yani settings.app'daki sürüm numarası ayarına dokunabilirim ve düzenlenebilir.
motionpotion

8
@ Ben-clayton'un koyduğu bash senaryosu benim için işe yaramadı, bu yüzden cevabına göre yeniden yapıyorum, işte: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
${INFOPLIST_PATH}info plist yolu için kullanabilirsiniz
Tomer Even

23

Ben Clayton'ın plistini kullanma https://stackoverflow.com/a/12842530/338986

Run scriptArdından aşağıdaki kod parçacığı ile ekleyin 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"

CFBundleVersionEk olarak ekleniyor CFBundleShortVersionString. Şu şekilde sürüm yayar:

$CODESIGNING_FOLDER_PATH/Settings.bundle/Root.plist Birinin yerine yazmanın $SRCROOTbazı faydaları vardır.

  1. Deponun çalışan kopyasındaki dosyaları değiştirmez.
  2. Sen dava yoluna gerekmez Settings.bundleiçinde $SRCROOT. Yol değişebilir.

Xcode 7.3.1 üzerinde test etme


1
Komut dosyasını proje şemasının Build, Pre-actions bölümüne eklerseniz bu en iyi yanıt IMO'dur. Andy'nin cevabına bak.
Vahid Amiri

2
Bu benim için çalışıyor. "VarsayılanDeğer" i size özel olacak şekilde değiştirmeyi unutmayın. Örneğin, altbilgiyi değiştirmek istedim, bu yüzden "AltbilgiMetni" kullandım. Ayrıca, "PreferenceSpecifiers" dan sonraki sayıyı, plistteki öğeyle ilişkilendirilmesi için değiştirmeniz gerekir.
Richard Witherspoon

12

Buradaki örneğe göre , ayarlar paketi sürüm numarasını otomatik olarak güncellemek için kullandığım komut dosyası şu şekildedir:

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

Settings.bundle'da sahip olduğum 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>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>

Çok kullanışlı - PlistBuddy'yi Python'dan çalıştırırken sorun yaşıyorum ve kullanmayı asla düşünmezdim NSDictionary(ve bunun size plist dosyalarına bu kadar kolay erişim sağladığını da fark etmemiştim)
Dov

Bunun için teşekkür ederim. Bir değişiklik - şimdi sahip olduğunuz gibi, builddir'de değil, kaynakta bir değişiklik yapar - bu, cihazınızda veya simülatörde gördüğünüz şeyin her zaman gerçek derleme sürümünün arkasındaki bir yapı sürümü olacağı anlamına gelir. Bunu düzeltmek için, betiğinizi önce kaynak üzerinde, sonra da builddir, yani. settings_path_build = os.path.join (os.environ.get ('TARGET_BUILD_DIR'), settings_file_path_build)
xaphod

... ve ayrıca, githash'ı ekliyorum:gitHash = subprocess.check_output(["git", "rev-parse", "--short", "HEAD"]).rstrip()
xaphod

8

Diğer yanıtlar bir nedenden dolayı doğru çalışmaz: Çalıştırma betiği oluşturma aşaması, Ayarlar Paketi paketlendikten SONRA yürütülmez. Dolayısıyla, Info.plist sürümünüz 2.0.11 ise ve bunu 2.0.12'ye güncellerseniz, projenizi derleyin / arşivleyin, Ayarlar paketi yine de 2.0.11 diyecektir. Ayarlar paketi Root.plist'i açarsanız, sürüm numarasının derleme işleminin SONuna kadar güncellenmediğini görebilirsiniz. Ayarlar paketini doğru şekilde güncellemek için projeyi TEKRAR oluşturabilir veya komut dosyasını bunun yerine bir ön oluşturma aşamasına ekleyebilirsiniz ...

  • XCode'da proje hedefiniz için Şemayı Düzenleyin
  • BUILD şemasındaki açıklama okuna tıklayın
  • Ardından, "Ön işlemler" öğesini tıklayın
  • Artı işaretini tıklayın ve "Yeni Komut Dosyası Çalıştırma Eylemi" ni seçin
  • Kabuk değerini / bin / sh olarak ayarlayın
  • Proje hedefiniz için "Derleme ayarlarını sağlayın" seçeneğini belirleyin
  • Komut dosyanızı metin alanına ekleyin. Aşağıdaki komut dosyası benim için çalıştı. Proje kurulumunuza uyması için yolları değiştirmeniz gerekebilir:

    versionString = $ (/ usr / libexec / PlistBuddy -c "CFBundleVersion'ı Yazdır" "$ {PROJECT_DIR} / $ {INFOPLIST_FILE}")

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

Bu, derleme / arşivleme işlemi sırasında Ayarlar paketi paketlenmeden ÖNCE komut dosyasını doğru şekilde çalıştıracaktır. Ayarlar paketi Root.plist'i açar ve projenizi oluşturur / arşivlerseniz, sürüm numarasının derleme işleminin başında güncellendiğini ve Ayarlar paketinizin doğru sürümü görüntülediğini göreceksiniz.


Teşekkürler, yalnızca çözümünüz doğru derleme sürümünü gösterir. İki kez inşa etmek için gereken diğer çözümler.
Boris Y.

Bu hala benim için Xcode 10.0
Patrick

@Patrick iOS ayarları uygulaması bazen eski bilgileri korur. Değişikliği görmek için, Ayarlar uygulamasını kapatmanız ve yeniden başlatmanız gerekir.
Andy

1
BTW, bu komut dosyasını eklemenin daha basit bir yolunu buldum: Proje hedefinizin Oluşturma Aşamaları sekmesine gidin ve "+" simgesine tıklayın. "Yeni Çalıştırma Komut Dosyası Aşaması" nı seçin ve komut dosyasını oraya ekleyin. BU ANAHTAR: yeni çalıştırma komut dosyasını tıklayın ve Hedef Bağımlılıklar altında Derleme Kaynaklarından önce Derleme Aşamaları listesinin en üstüne sürükleyin. Bu, Pre-build komut dosyasıyla aynı şekilde davranır ve bulunması daha kolaydır.
Andy

Teşekkürler @Andy, Derleme Aşamaları sekmesine ekleme çözümünüz mükemmel çalıştı.
Patrick

7

Xcode 11.4 ile, uygulama sürümünü uygulamanızın ayarlar paketinde görüntülemek için aşağıdaki adımları kullanabilirsiniz.


Küme $(MARKETING_VERSION)ve $(CURRENT_PROJECT_VERSION)değişkenler

Not: Info.plist içinde ve anahtarları için $(MARKETING_VERSION)ve $(CURRENT_PROJECT_VERSION)değişkenleri görünürse , aşağıdaki adımları atlayabilir ve sonraki bölüme geçebilirsiniz.Bundle version string (short)Bundle version

  1. Xcode projesini açın.
  2. Proje Gezgini'ni ( cmd1) açın , projenizin ayarlarını ortaya çıkarmak için projenizi seçin ve ardından uygulama hedefini seçin.
  3. Genel sekmesini seçin .
  4. In Kimlik bölümünde, değiştirmek Sürüm bazı yeni değere (örneğin saha içeriği 0.1.0) ve değişim Yapı bazı yeni değere (örneğin saha içeriği 12). Bu 2 değişiklik Info.plist dosyasında $(MARKETING_VERSION)ve $(CURRENT_PROJECT_VERSION)değişkenleri oluşturacaktır .

Ayarlar Paketi oluşturun ve yapılandırın

  1. In Proje Navigator , projenizi seçin.
  2. Dosya > Yeni > Dosya… ( cmdN) öğesini seçin .
  3. İOS sekmesini seçin .
  4. Seç Ayarlar Paketi içinde Kaynak bölümünde, ardından İleri ve oluşturma .
  5. Root.plist'i seçin ve kaynak kodu olarak açın. İçeriğini aşağıdaki kodla değiştirin:
<?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>

Çalıştırma Komut Dosyası Ekle

  1. In Proje Navigator , projenizi seçin.
  2. Uygulama hedefini seçin.
  3. Derleme Aşamaları sekmesini seçin .
  4. Click + > Yeni Run Script Aşama .
  5. Yeni aşamayı Paket Kaynaklarını Kopyala bölümünün üzerinde bir yere sürükleyip bırakın . Bu şekilde, komut dosyası, uygulamayı derlemeden önce çalıştırılacaktır.
  6. Yeni eklenen Komut Dosyası Çalıştır aşamasını açın ve aşağıdaki komut dosyasını ekleyin:
version="$MARKETING_VERSION"
build="$CURRENT_PROJECT_VERSION"
/usr/libexec/PlistBuddy -c "Set PreferenceSpecifiers:0:DefaultValue $version ($build)" "${SRCROOT}/Settings.bundle/Root.plist"

Uygulamayı başlat

  1. Ürünü ( cmdR) cihaz veya simülatörde çalıştırın.
  2. Cihaz veya simülatörde, uygulama başlatıldığında, Ayarlar uygulamasını açın ve üçüncü taraf uygulamalar listesinden uygulamanızı seçin. Uygulamanın sürümü aşağıda gösterildiği gibi görüntülenmelidir:


Kaynaklar


Bu benim için bir hata veriyorSet: Entry, "PreferenceSpecifiers:0:DefaultValue", Does Not Exist
Jordan H

2
Bu benim için çalıştı:/usr/libexec/PlistBuddy "$SRCROOT/AppName/Settings.bundle/Root.plist" -c "set PreferenceSpecifiers:0:DefaultValue $version"
Jordan H

Teşekkürler. Benim için bu ne dünya. Ama benimki Settings-Watch.bundle olarak adlandırıldı ve($build)
Kurt Lane

3

PListcompiler ( http://sourceforge.net/projects/plistcompiler ) açık kaynak porject kullanarak istediğimi yapmayı başardım .

  1. Bu derleyiciyi kullanarak, aşağıdaki biçimi kullanarak özellik dosyasını bir .plc dosyasına yazabilirsiniz:

    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. Burada brad-larson tarafından açıklandığı gibi, depo revizyonumu .h dosyasına çıkaran özel bir çalıştırma komut dosyası oluşturma aşamam vardı .

  3. Plc dosyası, #define, #message, #if, #elif, #include, #warning, #ifdef, #else, #pragma, #error, #ifndef, #endif, xcode ortam değişkenleri gibi önişlemci yönergeleri içerebilir. Bu yüzden, aşağıdaki yönergeyi ekleyerek kRevisionNumber değişkenine başvurabildim

    #include "Revision.h"
    
  4. Proje her oluşturulduğunda plcompiler'ı çalıştırmak için xcode hedefime özel bir komut dosyası oluşturma aşaması da ekledim

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

Ve işte buydu!


Bu, bir plist dosyasındaki tek bir değeri değiştirmek için çok fazla iş gibi geliyor ... Bir plist oluştururken bir değişkene erişebilmek kavramsal olarak harika, ancak plist dosyası için bir araç derlemesi kullanmak çok daha kolay. PlistBuddy'yi cevabımda tanımlıyorum - bir dene!
Quinn Taylor

3

@Ben Clayton cevabına ve @Luis Ascorbe ve @Vahid Amiri'nin yorumlarına dayanan çalışma örneğim:

Not: Bu yaklaşım, havuzun çalışan kopyasındaki Settings.bundle / Root.plist dosyasını değiştirir.

  1. Proje kökünüze bir ayar paketi ekleyin. Yeniden adlandırmayın

  2. Settings.bundle / Root.plist'i SourceCode olarak açın

    İçeriği şununla değiştirin:

    <?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. Aşağıdaki betiği proje (hedef) düzeninin Build, Pre-actions bölümüne ekleyin

    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. Mevcut şemayı oluşturun ve çalıştırın


2

Yukarıdaki cevaplar benim için işe yaramadı, bu yüzden özel komut dosyamı oluşturdum.

Bu, Root.plist'teki girişi dinamik olarak günceller.

Aşağıdaki çalıştırma komut dosyasını kullanın. Kesinlikle xcode 10.3'te doğrulanmış olarak çalışacağız.

"var buildVersion", başlıkta görüntülenecek sürümdür.

Ve tanımlayıcı adı, settings.bundle Root.plist içindeki başlık için aşağıdaki "var version" dır.

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 içindeki örnek giriş

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

Çalışma örneği Root.plist girişi


1

Sana anlattıklarıma benzeyen bir yol kullanarak yapabilirsiniz inanıyoruz bu cevabı (dayanan bu yazı ).

İlk olarak, VersionValue'u $ {VERSIONVALUE} olarak yeniden adlandırarak Xcode içinde bir değişken yapabilirsiniz. Versionvalue.xcconfig adlı bir dosya oluşturun ve bunu projenize ekleyin. Uygulama hedefinize gidin ve bu hedef için Yapı ayarlarına gidin. Kullanıcı tanımlı derleme ayarı olarak VERSIONVALUE eklemeniz gerektiğine inanıyorum. Bu pencerenin sağ alt köşesinde, Esas Alınan değerini "sürüm değeri" olarak değiştirin.

Son olarak, hedefinize gidin ve bir Çalıştırma Komut Dosyası oluşturma aşaması oluşturun. Komut Dosyası Çalıştır aşamasını inceleyin ve komut dosyanızı Komut Dosyası metin alanına yapıştırın. Örneğin, BUILD_NUMBER ayarımı mevcut Subversion yapısıyla etiketlemek için komut dosyam aşağıdaki gibidir:

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

Bu, projenizde bu değerler değiştiğinde değişkeni değiştirme hilesini yapmalıdır.


Sürüm numarasını Info.plist dosyasına eklemek istersem bu işe yarar. Ancak diğer plist dosyaları için çalışmasını sağlayamıyorum, örneğin Settings.bundle'da bulunan Root.plist dosyası. Bunu etkinleştirmek için kullanabileceğim bir yapı ayarı var mı?
Panagiotis Korros

0

Benim için bu en kolay çözümdü:

Paket Kaynaklarını Kopyala adımından önce yeni komut dosyası oluşturma aşaması ekleyin

Kabuk: /usr/bin/env python

İçerik:

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