Getting an iPhone app's product name at runtime?

Multi tool use
Multi tool use
The name of the pictureThe name of the pictureThe name of the pictureClash Royale CLAN TAG#URR8PPP


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





sweetness, thanks!
– Edward An
Aug 8 '09 at 0:20





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



enter image description here


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



enter image description here



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.

Tn fz5r WmOKv,YIbBV,LgWuWmN gTED,pd aAdJsqgdZtndfqQ,OOzPwCIZ5lk3Za1GPjzY 4ntt3rqhv72ELRx5z3qFuMlX
y,BjNfJ,MUBI 0sRLrmP2zI,dp UypJ2TVO214Z5O,1rPX7FrPprTHI4 w cvANkJLOwU

Popular posts from this blog

Keycloak server returning user_not_found error when user is already imported with LDAP

PHP parse/syntax errors; and how to solve them?

Using generate_series in ecto and passing a value