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

73

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

13个回答

143

试一试这个

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

24
CFBundleDisplayName 返回 Bundle 显示名称。 OP 要求产品名称。对于此,请使用 CFBundleName。在大多数情况下,这两个名称相同,但如果您设置新的显示名称(用于在图标下显示的某些内容,不适合作为文件名),则可能会不同。 - Chris Newman
4
苹果在一篇技术文章中讨论了这个问题。值得注意的是,CFBundleDisplayName没有常量 -- 使用字符串字面量是正确的方法。 - Phil Calvin
2
@ChrisNewman错了:CFBundleName绝对不是产品名称(您可以通过在xcode设置中更改其中一个而不更改另一个来检查此内容)。它们默认情况下是相同的。(我以艰难的方式发现了这一点)。 - Adam
由于我的评论在1到3个SDK版本之间已经过时,那么对于这个问题,现在的正确答案是什么? - Chris Newman

55

这里有很好的答案。我想再补充一点。

不要使用可能在未来更改的@"CFBundleDisplayName",最好像下面这样将在CFBundle.h中提供的字符串常量转换:

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

这样可以使你的代码具有未来兼容性。


8
这是一个不同的键,可能并非在所有情况下都是显示名称。令人惊讶的是,在这种特定情况下,苹果推荐使用字符串字面值。 - Phil Calvin

45

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

使用此方法比其他访问方法更可取,因为当可用时,它返回键的本地化值。

以下是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

快点,伙计们……这就是高质量的答案。 - Jonny
Swift3的编程方式发生了重大变化 - let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String - Jef
可以使用常量kCFBundleNameKey代替简单字符串: kCFBundleNameKey as String - Matt Mc

14

当我使用 InfoPlist.strings 进行应用名称本地化时,出现了问题,例如:

CFBundleDisplayName = "My Localized App Name";

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

在这种情况下,我可以像下面这样使用localizedInfoDirectory。

NSDictionary *locinfo = [bundle localizedInfoDictionary];

9
您可以使用直接的方法,
NSString* appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];

6

完整的说,Swift 3.0 就是:

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

为什么不留评论就点踩呢?代码是可用的,而且答案也没有重复 :/ - Patrick
1
这实际上并没有回答问题,问题是要求产品名称,它可以与捆绑显示名称不同。 - awolf

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;

1
一个简单的方法如下。请注意,这将返回您的应用程序包的名称,您可以更改它以使其与您的应用程序产品名称不同。
// (Swift 5)
static let bundleName = Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String) as! String

如果您希望应用程序的名称与捆绑包不同,并且可能更改Info.plist,您可以执行以下操作:
// (Swift 5)
// To use this, include a key and value in your app's Info.plist file:
// Key: ProductName
// Value: $(PRODUCT_NAME)
// By default PRODUCT_NAME is the same as your project build target name, $(TARGET_NAME), but this may be changed.
// If you do so, you may wish to change the CFBundleName value to $(TARGET_NAME) in the Info.plist file.
// PRODUCT_NAME is defined in the target's Build Settings in the Packaging section.
static let productName = Bundle.main.object(forInfoDictionaryKey: "ProductName") as! String

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

enter image description here

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

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接