2009-09-29 45 views

回答

24

鍵後繼續搜索和測試,我找到了自己的解決方案。

NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary]; 
NSLog(@"%i Keys: %@", [infoDictionary count], 
      [[infoDictionary allKeys] componentsJoinedByString: @" ,"]); 

這snipplet給了我下面的輸出:

20個按鍵:NSBundleResolvedPath,CFBundleVersion,NSBundleInitialPath,CFBundleIdentifier,NSMainNibFile,CFBundleIconFile,CFBundleInfoPlistURL,CFBundleExecutable,DTSDKName,UIStatusBarStyle,CFBundleDevelopmentRegion,DTPlatformName, CFBundleInfoDictionaryVersion,CFBundleSupportedPlatforms,CFBundleExecutablePath,CFBundleDisplayName,LSRequiresIPhoneOS,CFBundlePackageType,CFBundleSignature,CFBundleName

因此,解決辦法很簡單,只要:

NSString *version =[[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleVersion"]; 

然而,這是不是當前項目版本所看到的截圖,但plist文件的捆綁版本。

+1

我認爲版本控制包括在XCode中爲你的項目添加倉庫和設置SCM,這可能不是你想要的版本(儘管我可能是錯的)。 – Eimantas 2009-09-29 13:53:36

+0

如果您將plist文件中的CFBundleVersion值設置爲$ {CURRENT_PROJECT_VERSION},它將被替換爲來自構建設置的當前項目版本中的內容。然後你可以使用agvtool bump來增加內部版本號。 – mjk 2013-12-20 02:55:25

+2

此外,如果需要,可以使用'CFString'' kCFBundleVersionKey'來代替硬編碼的字符串'@「CFBundleVersion」',如果需要的話,可以將其轉換爲'NSString',如上面的代碼所要求的。 – trss 2014-02-11 17:19:11

12

看着你Info.plist文件,其中應該有像CFBundleVersionCFBundleShortVersionString

+6

更多信息: http://developer.apple.com/mac/library/documentation/MacOSX/Conceptual/BPRuntimeConfig/文章/ PListKeys.html#// apple_ref/doc/uid/20001431-102364 http://www.dribin.org/dave/blog/archives/2006/08/02/versioning_os_x_apps/ – 2009-09-29 13:00:47

+0

ghommey - 有一個列表指南在developer.apple.com上進行編程。我相信你現在可以自己找到) – Eimantas 2009-09-29 13:13:10

7

構建信息中的那些項目不適用於您的構建應用程序。他們是佔位符,您可能會將其拉入您的應用程序。您的應用程序中包含的任何內容都是您放置在應用程序的Resources文件夾中的任何內容,如任何文本文件,plist或版本控制工程師的精美圖片。

現在,您可以使用特殊標識符(如$ {VERSION_INFO_PREFIX}或其他標記)將「構建信息」窗口中的一些項目拉入info.plist。如果您單擊上面包含的窗口中左側的任何項目,則可以使用這些標記。例如,單擊「當前項目版本」一詞並複製您在底部看到的標記「CURRENT_PROJECT_VERSION」。然後去你的plist文件,並添加一個條目。給它任何你想要的名字或者「當前工程版本」。粘貼在右側的$ {CURRENT_PROJECT_VERSION}中。現在,您可以通過編程方式從應用中獲取該值。當然,現在有人必須將該值輸入到Build Info窗口或其他地方的適當位置。只需要在info.plist文件中管理這個和像這樣的字段就可以了。這取決於你如何處理這些事情。

這裏是我得到的版本信息從我的info.plist的:

+ (NSString *) getAppVersionNumber; 
{ 
    NSString *myVersion, 
       *buildNum, 
       *versText; 

    myVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
    buildNum = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleVersionKey]; 
    if (myVersion) { 
     if (buildNum) 
      versText = [NSString stringWithFormat:@"Version: %@ (%@)", myVersion, buildNum]; 
     else 
      versText = [NSString stringWithFormat:@"Version: %@", myVersion]; 
    } 
    else if (buildNum) 
     versText = [NSString stringWithFormat:@"Version: %@", buildNum]; 
    NSLog(versText); 
    return versText; 
} 
+0

「未定義或垃圾值返回給調用者」!刪除versText並在其位置上放置返回語句。最後歸零。 – testing 2010-09-28 12:35:58

+1

不要這樣'NSLog'。它應該是'NSLog(@「%@」,versText);'。如果'versText'仍未定義,這可能來自代碼,這將導致崩潰。 – Mundi 2012-01-01 14:33:13

4
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] valueForKey:@"CFBundleVersion"]; 

總是返回我相同的值(初始版本),即使我改變從項目設置的版本,但。

NSString * appVersionString = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; 

有竅門。

+0

CFBundleVersion - 彙編代碼。不是版本字符串。 – ETech 2016-01-19 02:46:54

1

對於這裏的懶惰是迅速的版本:

NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleShortVersionString")! 
1

NSBundle.mainBundle.infoDictionary[@"CFBundleShortVersionString"];

相關問題