Getting an iPhone app's product name at runtime?

Multi tool use


Getting an iPhone app's product name at runtime?
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.
12 Answers
12
Try this
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
NSString *prodName = [info objectForKey:@"CFBundleDisplayName"];
CFBundleDisplayName returns the Bundle Display Name. OP asked for the Product Name. For this use CFBundleName. In most cases the two will be the same, but may be different if you set a new display name (for something displayed under the icon which is not suitable as a filename).
– Chris Newman
Oct 28 '11 at 10:39
Apple discusses this in a technical article.. Of particular note is that there's no constant for
CFBundleDisplayName
-- a string literal is the right thing to use.– Phil Calvin
Nov 21 '12 at 20:00
CFBundleDisplayName
@ChrisNewman is incorrect: CFBundleName is absolutely NOT the Product Name (you can check this by changing one but not the other in your xcode settings). They default to being the same. (I discovered this the hard way).
– Adam
Dec 1 '14 at 10:35
CFBundleName is what works for me
– 2cupsOfTech
May 14 '15 at 17:07
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.
This is a different key and might not be the display name in all cases. Surprisingly, a string literal is what Apple recommends for this particular case.
– Phil Calvin
Nov 21 '12 at 20:01
awesome answer..
– svmrajesh
Apr 3 '14 at 11:22
According to Apple, using - objectForInfoDictionaryKey:
directly on the NSBundle
object is preferred:
- objectForInfoDictionaryKey:
NSBundle
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
Come on people... this is the quality answer.
– Jonny
Nov 18 '15 at 9:28
has changed significantly for swift3 - let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as! String
– Jef
Mar 20 '17 at 12:48
Could use the constant
kCFBundleNameKey
instead of a simple string: kCFBundleNameKey as String
– Matt Mc
Apr 4 at 21:40
kCFBundleNameKey
kCFBundleNameKey as String
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];
You can use the direct approach,
NSString* appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"];
For completeness, Swift 3.0 would be;
let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String
Why vote down with no comment? The code works and the answer isn't a duplicate :/
– Patrick
Sep 5 '16 at 10:13
I'll give you an upvote man - I got you
– Byron Coetsee
Nov 17 '16 at 14:23
This is actually not answering the question which is asking for the Product Name which can be set differently than the Bundle Display Name.
– awolf
Feb 6 '17 at 17:27
Here's the cleanest approach I could come up with using Swift 3:
let productName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String
Here is the Xamarin.iOS version of @epatel's answer:
var prodName = NSBundle.MainBundle.InfoDictionary.ObjectForKey(new NSString("CFBundleDisplayName")) as NSString;
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"]!
The following code would be better.
NSBundle *bundle = [NSBundle mainBundle];
NSDictionary *info = [bundle infoDictionary];
self.appName = [info objectForKey:@"CFBundleExecutable"];
let productName = Bundle.main.infoDictionary?["CFBundleName"] as? String
let displayName = Bundle.main.infoDictionary?["CFBundleDisplayName"] as? String
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];
By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.
sweetness, thanks!
– Edward An
Aug 8 '09 at 0:20