2009-09-29 43 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"];

相关问题