如何在iOS中获取正在运行的应用程序的名称


78

如果主屏幕上图标下方的应用程序名称为“我的真棒应用程序”,您如何在运行时在应用程序中获取该字符串?

Answers:


133

我会尝试

[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleDisplayName"];

尽管大概您知道自己的应用名称,但可以使用它…


5
尽管常量不存在,但此方法有效。猜它是@“ CFBundleDisplayName”。我不想硬编码应用名称,因为我编写的代码可能会在其他应用中使用。
乔纳森

啊,您是对的,这里没有常量(我复制了一些已有的代码,但使用了另一个密钥)。原始字符串应该没问题。
大卫·邓纳姆

在我将Bundle display name属性添加到Info.plist文件中之后,这对我有用。
pasql 2015年

5
不是CFBundleDisplayName而是CFBundleName。不要被欺骗
LKM 2015年

1
这要看情况。检查文档CFBundleDisplayName。
大卫·邓纳姆

28

斯威夫特3&4

Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? ""
Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? ""


斯威夫特2.2

NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleName")
NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleDisplayName")


有关“ CFBundleName”和“ CFBundleDisplayName”的更多信息

以下摘自Apple关于Core Foundation Keys的文档

CFBundleName,“捆绑包名称”,捆绑包的简称;不应被用户看到。有关详细信息,请参见CFBundleName。(推荐,可本地化)

CFBundleDisplayName,“包显示名称”,包的用户可见名称;由Siri使用,并在iOS的主屏幕上可见。有关详细信息,请参见CFBundleDisplayName。(必需,可本地化)


1
该文档说CFBundleDisplayName是必需的键……而且,它说CFBundleName是“ bundle的短名称;不应被用户看到。”
David Dunham

谢谢@DavidDunham!我在答案中的“关于'CFBundleName'和'CFBundleDisplayName'的更多信息”下更新了文本,以匹配Apple当前的文档。
Mobile Dan

好奇:如果使用此代码可能为零,并且应该提供默认值,那么使用它有什么意义呢?为什么不仅仅使用该值?
丹尼尔·斯普林格'18

19
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];

14

只是因为我喜欢Xcode 4.5获得数组项的新方法。:)

- (NSString*)project_getAppName {
    return NSBundle.mainBundle.infoDictionary[@"CFBundleDisplayName"];
}

1
这是什么法术?我不知道你能做到这一点。
Pochi 2013年

Swft中是否存在?
丹尼尔·斯普林格


7
#include <stdlib.h>

// work for iOS and MacOSX and ~23 times faster than get name from bundle
NSString *app = [NSString stringWithUTF8String:getprogname()];

如果您正在编写不在捆绑结构中或没有Info.plist文件来填充infoDictionary的命令行工具,也很有用。
user2067021 '17

5

迅捷3/4

let appName =  Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String) as? String

4

斯威夫特3、4和5

let appName = Bundle.main.infoDictionary?["CFBundleName"] as? String

3
NSString* applicationName = [entry objectForKey:(id)kCGWindowOwnerName];

这是一篇很好的文章,其中包含您要寻找的示例。OP没有接受任何东西,这很不幸,但是答案很有用。


谢谢,该帖子中的一些重要信息。尽管更喜欢Davids回答中的一位班轮;)+1
Jonathan

1

注意事项

如果您localizations在应用中执行,则应使用blew代码获取真实的本地化显示名称:

Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String ?? ""
Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ?? ""

而不是

Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String) as? String
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.