在运行时获取iPhone应用程序的产品名称?


71

如何做到这一点?我想获得名称,以便我可以在应用程序中显示它,而不必每次更改名称时都在代码中对其进行更改。

Answers:


141

尝试这个

NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
NSString *prodName = [info objectForKey:@"CFBundleDisplayName"];

23
CFBundleDisplayName返回捆绑显示名称。OP要求提供产品名称。为此,请使用CFBundleName。在大多数情况下,两者将是相同的,但是如果您设置了新的显示名称(对于图标下方显示的名称(不适合用作文件名)),则两者可能会有所不同。
克里斯·纽曼

4
苹果在技术文章中对此进行了讨论。特别需要注意的是,没有常量CFBundleDisplayName-字符串文字是正确的用法。
Phil Calvin 2012年

2
@ChrisNewman是错误的:CFBundleName绝对不是产品名称(您可以通过在xcode设置中更改一个而不更改另一个来进行检查)。它们默认为相同。(我很难发现这一点)。
亚当

由于我的评论在1到3个SDK版本之间已过时,因此该问题的当前正确答案是什么?
克里斯·纽曼

55

好答案在这里。我会添加一件事。

最好不要使用@“ CFBundleDisplayName”(将来可能会更改),而最好像这样转换CFBundle.h中提供的字符串常量:

[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];

从而对您的代码进行过时的验证。


8
这是一个不同的键,在所有情况下都可能不是显示名称。出乎意料的是,对于这种特殊情况,Apple建议使用字符串文字。
菲尔·加尔文

41

根据苹果的说法,首选- objectForInfoDictionaryKey:直接在NSBundle对象上使用:

与其他访问方法相比,使用此方法更为可取,因为在有密钥可用时,它将返回密钥的本地化值。

这是Swift中的示例:

let appName = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as! String
// Or use key "CFBundleDisplayName"

Swift 3的更新-感谢Jef。

let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String

来吧人...这是质量的答案。
强尼

swift3发生了显着变化-让appName = Bundle.main.object(forInfoDictionaryKey:“ CFBundleName”)为!琴弦
杰夫

可以使用常量kCFBundleNameKey而不是简单的字符串:kCFBundleNameKey as String
Matt Mc

14

使用InfoPlist.strings本地化应用程序名称时出现问题,例如

CFBundleDisplayName = "My Localized App Name";

如果使用infoDictionary,则无法获取本地化的应用程序名称。

在那种情况下,我使用如下的localizedInfoDirectory。

NSDictionary *locinfo = [bundle localizedInfoDictionary];

8

您可以使用直接方法,

NSString* appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];

6

为了完整起见,Swift 3.0应该是;

let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String

为什么不加评论投反对票?代码有效,答案不是重复的:/
Patrick Patrick

1
实际上,这不是在回答要求产品名称的问题,该产品名称可以与捆绑显示名称设置不同。
awolf'2

2

这是我可以使用Swift 3想到的最干净的方法:

let productName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String

1

这是@epatel答案的Xamarin.iOS版本:

var prodName = NSBundle.MainBundle.InfoDictionary.ObjectForKey(new NSString("CFBundleDisplayName")) as NSString;

0

这只是一个非常古老的问题的快速更新。我需要快速答案,并且在快速语法中有点棘手(展开可选内容),因此请在此处共享

let productName = NSBundle.mainBundle().infoDictionary!["CFBundleName"]!

0

以下代码会更好。

NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
self.appName = [info objectForKey:@"CFBundleExecutable"];

0
let productName =  Bundle.main.infoDictionary?["CFBundleName"] as? String

在此处输入图片说明

let displayName =  Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String

在此处输入图片说明


-2

您可以从该词典“ info”中获得所有捆绑包详细信息。打印此词典并获得您想要的。

NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.