iphone - ios下載 - 如何在應用程序的設置包中顯示應用程序版本修訂版?




settings ios下載 (6)

使用本克萊頓的plist https://stackoverflow.com/a/12842530/338986

Copy Bundle Resources後添加Run script和以下片段。

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. 您不需要在$SRCROOT指定Settings.bundle路徑。 路徑可能會有所不同。

在Xcode 7.3.1上測試

我想在應用程序的設置包中包含應用程序版本和內部修訂版本,如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文件的方法,並在不影響源文件的情況下替換版本號。


其他答案由於以下原因無法正常工作:運行腳本構建階段在封裝設置包之後才會執行。 所以,如果你的Info.plist版本是2.0.11,並且你更新到2.0.12,然後建立/存檔你的項目,設置包仍然會說2.0.11。 如果您打開設置包Root.plist,則可以看到版本號在構建過程結束之前不會更新。 您可以構建項目AGAIN以正確更新設置包,也可以將腳本添加到預構建階段,而不是......

  • 在XCode中,編輯項目目標的Scheme
  • 點擊BUILD方案上的顯示箭頭
  • 然後,點擊“預執行”項目
  • 點擊加號並選擇“新建運行腳本操作”
  • 將shell值設置為/ bin / sh
  • 將“提供構建設置”設置為您的項目目標
  • 將您的腳本添加到文本區域。 以下腳本適用於我。 您可能需要修改路徑以匹配您的項目設置:

    versionString = $(/ usr / libexec / PlistBuddy -c“打印CFBundleVersion”“$ {PROJECT_DIR} / $ {INFOPLIST_FILE}”)

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

這將在構建/歸檔過程中打包設置包之前正確運行腳本。 如果您打開設置包Root.plist並構建/存檔您的項目,您現在將看到版本號在構建過程開始時更新,您的設置包將顯示正確的版本。


基於這裡的例子,下面是我用來自動更新設置包版本號的腳本:

#! /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中獲得的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>

我懶惰的人的解決方案是從我的應用程序代碼更新版本號。 你可以在Root.plist中有一個默認值(或空白),然後在啟動代碼的某個地方:

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

唯一的問題是您的應用必須至少運行一次才能使更新後的版本顯示在設置面板中。

您可以進一步理解並更新,例如,您的應用程序已啟動多少次的計數器或其他有趣的信息。


我設法通過使用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目標添加了一個自定義腳本構建階段,以在項目每次構建時運行該編譯器

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

就是這樣!


還有另一種解決方案比以前的答案要簡單得多。 Apple在其大多數安裝程序中捆綁了名為PlistBuddy的命令行工具,並將其包含在Leopard的/usr/libexec/PlistBuddy

由於您想要替換VersionValue ,因此假設您已將版本值提取到$newVersion ,則可以使用以下命令:

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

無需擺弄sed或正則表達式,這種方法非常簡單。 有關詳細說明,請參閱手冊頁 。 您可以使用PlistBuddy添加,刪除或修改屬性列表中的任何條目。 例如,我的一個朋友使用PlistBuddy 在Xcode中發布了關於增加內部版本號的博客。

注意:如果您只提供plist路徑,PlistBuddy會進入交互模式,因此您可以在決定保存更改之前發出多個命令。 我絕對建議你在構建腳本中使用它之前先做這個。





settings-bundle