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

如何做到这一点?我想得到的名称,所以我可以显示它在一个应用程序,而不必改变它的代码,每次我改变一个名称,当然。

37499 次浏览

试试这个

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

当我使用 InfoPlist.string 本地化应用程序名称时,遇到了一个问题,比如

CFBundleDisplayName = "My Localized App Name";

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

在这种情况下,我使用 localizedInfoDirectory,如下所示。

NSDictionary *locinfo = [bundle localizedInfoDictionary];

你可以用直接的方法,

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

回答得不错,不过我要补充一点。

与其使用@“ CFBundleDisplayName”(它在将来可能会发生变化) ,不如像下面这样强制转换 CFBundle.h 中提供的字符串常量:

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

这样就可以防止代码出现未来问题。

你可以从这本字典“信息”中获得所有的捆绑细节。打印这本字典并得到你想要的。

NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];

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

此方法的使用优于其他访问方法,因为它在键可用时返回键的本地化值。

下面是斯威夫特的一个例子:

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

更新为 Swift 3-感谢 Jef。

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

这只是对这个古老问题的一个快速更新。我需要快速的答案,这是一种技巧(打开可选项)在快速的语法,所以在这里分享

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

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

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

下面是我使用 Swift 3能想到的最干净的方法:

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

下面的代码会更好。

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

以下是 Xamarin.iOS 版@epatel 的回答:

var prodName = NSBundle.MainBundle.InfoDictionary.ObjectForKey(new NSString("CFBundleDisplayName")) as NSString;
let productName =  Bundle.main.infoDictionary?["CFBundleName"] as? String

enter image description here

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

enter image description here

一个简单的方法如下。请注意,这将返回应用程序捆绑包的名称,您可以将其更改为与应用程序的产品名称不同。

// (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