Getting an iPhone app's product name at runtime?

IosIphone

Ios 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

enter image description here

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

enter image description here

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];

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionEdward AnView Question on Stackoverflow
Solution 1 - IosepatelView Answer on Stackoverflow
Solution 2 - IosimnkView Answer on Stackoverflow
Solution 3 - Iosabc123View Answer on Stackoverflow
Solution 4 - IostokentokenView Answer on Stackoverflow
Solution 5 - IoskarimView Answer on Stackoverflow
Solution 6 - IosPatrickView Answer on Stackoverflow
Solution 7 - IosdwlzView Answer on Stackoverflow
Solution 8 - IosrichdcsView Answer on Stackoverflow
Solution 9 - IosAndrew KingdomView Answer on Stackoverflow
Solution 10 - IosiprabaView Answer on Stackoverflow
Solution 11 - IosalonesView Answer on Stackoverflow
Solution 12 - IosRajeshKumar RView Answer on Stackoverflow
Solution 13 - Iosaaban tariqView Answer on Stackoverflow