Getting an iPhone app's product name at runtime?
IosIphoneIos Problem Overview
How can this be achieved? I would like to get the name so i can display it within an app, without having to change it in code each time i change a name, of course.
Ios Solutions
Solution 1 - Ios
Try this
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
NSString *prodName = [info objectForKey:@"CFBundleDisplayName"];
Solution 2 - Ios
Good answers here. I would add one thing though.
Rather than using @"CFBundleDisplayName", which has the potential to change in future, it's best to cast the string constant supplied in CFBundle.h like so:
[[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
Thus future-proofing your code.
Solution 3 - Ios
According to Apple, using - objectForInfoDictionaryKey:
directly on the NSBundle
object is preferred:
> Use of this method is preferred over other access methods because it returns the localized value of a key when one is available.
Here's an example in Swift:
let appName = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName") as! String
// Or use key "CFBundleDisplayName"
Update for Swift 3 - thanks Jef.
let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String
Solution 4 - Ios
I had a problem when I localize my application name by using InfoPlist.strings, like
CFBundleDisplayName = "My Localized App Name";
I could not obtain localized application name if I use infoDictionary.
In that case I used localizedInfoDirectory like below.
NSDictionary *locinfo = [bundle localizedInfoDictionary];
Solution 5 - Ios
You can use the direct approach,
NSString* appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
Solution 6 - Ios
For completeness, Swift 3.0 would be;
let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String
Solution 7 - Ios
Here's the cleanest approach I could come up with using Swift 3:
let productName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String
Solution 8 - Ios
Here is the Xamarin.iOS version of @epatel's answer:
var prodName = NSBundle.MainBundle.InfoDictionary.ObjectForKey(new NSString("CFBundleDisplayName")) as NSString;
Solution 9 - Ios
A simple way is as follows. Be aware that this returns the name of your app's bundle, which you can change to be different from your app's product name.
// (Swift 5)
static let bundleName = Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String) as! String
If you need your app to have a different name from the bundle and may change Info.plist, you could do something like the following:
// (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
Solution 10 - Ios
This is just a swift update for this very old question. I was in need of swift answer and it was kind of tricky(Unwrapping optionals) in swift syntax so sharing it here
let productName = NSBundle.mainBundle().infoDictionary!["CFBundleName"]!
Solution 11 - Ios
The following code would be better.
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
self.appName = [info objectForKey:@"CFBundleExecutable"];
Solution 12 - Ios
let productName = Bundle.main.infoDictionary?["CFBundleName"] as? String
let displayName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String
Solution 13 - Ios
You could have all bundle details from this dictionary "info". print this dictionary and get what you want.
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];