2012-04-04 104 views
34

在Xcode中手動設置版本號和版本號很容易,並且我學會了如何在構建時使用宏來增加它們。但是,我如何在代碼中引用它們的值?參考代碼中的內部版本號或版本號

+0

你有關於如何AUTOCREATE版本#分別引用/鏈接? – phlebotinum 2012-04-04 16:27:44

+0

@robo在下面看到我的「回覆」。 – RobertL 2012-04-08 17:22:10

回答

67

當然,你可以問你的主束的信息目錄,其中包括您的info.plist的所有鍵和值,包括版本號:

NSDictionary *info = [[NSBundle mainBundle] infoDictionary]; 
NSString *version = [info objectForKey:@"CFBundleShortVersionString"]; 
+1

發佈這個問題12分鐘內有5個好答案!所有人都值得一個綠色的支票,但我只能接受一個,所以我採取了最早的時間戳。 – RobertL 2012-04-08 16:24:44

+0

@RobertL在這種情況下,你可以提高他們的答案,給他們一些聲譽。 – JustSid 2012-04-08 16:50:42

+0

是否做到了。直到現在我才知道我可以這樣做。謝謝。 – RobertL 2012-04-08 17:39:12

3

你可以得到的info.plist值這片代碼(與要比照Recommended Info.plist Keys Info.plist中的主要替代CFBundleShortVersionString

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"] 
77
NSDictionary *infoDict = [[NSBundle mainBundle] infoDictionary]; 
NSString *appVersion = [infoDict objectForKey:@"CFBundleShortVersionString"]; // example: 1.0.0 
NSString *buildNumber = [infoDict objectForKey:@"CFBundleVersion"]; // example: 42 
+0

這是否記錄在Apple文檔的任何位置?謝謝! – snowbound 2014-10-02 03:10:34

+0

https://developer.apple.com/library/ios/documentation/general/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html記錄了可以在應用程序(實際上是任何包)中Info.plist的密鑰,包括這些二。 – 2014-10-02 03:31:19

10
NSBundle *bundle = [NSBundle mainBundle]; 
NSString *appVersion = [bundle objectForInfoDictionaryKey:(NSString *)@"CFBundleShortVersionString"]; 
NSString *appBuildNumber = [bundle objectForInfoDictionaryKey:(NSString *)kCFBundleVersionKey]; 
3

由於這些值存儲在應用程序的Info.plist你可以通過設置在NSBundle方法讀取,然後:

NSString * version = [[NSBundle mainBundle] objectForInfoDictionaryKey: CFBundleShortVersionString]; 

Accessing bundles contents作爲權威參照從你的Info.plist文件和Core Foundation keys可用的Info.plist獲取數據鍵。

13

@robo 我確實按照如何自動增加內部版本號(不是版本號,但是非常相似)寫了一篇文章,但現在我找不到它了。我會盡力解釋我做了什麼。我希望已經足夠清楚了。

在Xcode 4中,查看Navigator窗格,它是Xcode屏幕左側的窗格。它在頂部有7個圖標。選擇最左邊的圖標(看起來像一個文件夾)以獲得Project Navigator窗格。

現在單擊該窗格中的第一項,即項目本身。這在中間打開一個大窗口,左邊有一個窄欄。

窄欄包含2個部分:「PROJECT」和「TARGETS」。在「TARGETS」部分點擊您的項目名稱。現在中間窗格頂部有5個選項卡:「摘要」,「信息」,「生成設置」,「生成階段」和「生成規則」。

點擊「Build Phases」標籤。如果您的配置與我的配置相同,您現在將在主窗口中看到4個部分:「目標相關性」,「複製束資源」,「編譯源」和「鏈接...」。點擊「添加生成階段」(在右下角)並選擇「添加運行腳本」。第5部分現在出現在中心窗格中,標題爲「運行腳本」。將「運行腳本」部分向上拖動,使其位於「目標相關性」下方的第二部分。

現在單擊運行腳本部分的顯示三角形。這將打開一個窗口,您可以在其中放置腳本。將以下腳本複製並粘貼到該窗口中。

#!/bin/bash  
bN=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") 
bN=$((0x$bN)) 
bN=$(($bN + 1)) 
bN=$(printf "%X" $bN) 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bN" "$INFOPLIST_FILE" 

確保「只安裝運行腳本時,」未選中。

就是這樣!現在,每次構建項目時,您的內部版本號都會自動遞增。

此腳本假定您的info.plist文件中有一個純正的十六進制內部版本號,並將其作爲十六進制進行遞增。我不確定如果內部版本號丟失會發生什麼。但輸入起始值很簡單 - 只需在上面使用的同一個中心窗格中的「摘要」選項卡上,然後在「生成」框中輸入「1」(或任何您喜歡的值)(但不是格式化的像1.0的字符串)。


我認爲我先給的十六進制腳本不適用於提交到App Store。這是使用十進制算術的相同腳本。

#!/bin/bash  
bN=$(/usr/libexec/PlistBuddy -c "Print CFBundleVersion" "$INFOPLIST_FILE") 
((bN += 1)) 
bN=$(printf "%d" $bN) 
/usr/libexec/PlistBuddy -c "Set :CFBundleVersion $bN" "$INFOPLIST_FILE" 
+0

非常感謝。 (10char) – phlebotinum 2012-04-09 11:02:25

+0

令我驚訝的是,我已經瞭解到,十六進制版本號未通過App Store的驗證。我在下面發佈了一個回覆,其中包含一個修改後的十進制算術腳本。見下文。 – RobertL 2013-01-26 17:41:34

+0

我繼續前進,並在您的小數點腳本中對此答案的底部進行了編輯。這樣,其他答案可以刪除,減少一些雜亂無章。 – thegrinner 2013-06-28 18:33:07

0

在斯威夫特:

let version = NSBundle.mainBundle().infoDictionary?["CFBundleShortVersionString"] as? String