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

80

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

10个回答

139

我会尝试

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

虽然你应该知道你自己应用程序的名称并可以直接使用它...


5
虽然该常量不存在,但这段代码仍能正常工作。我猜测它可能是@"CFBundleDisplayName"。我不想在代码中硬编码应用程序名称,因为我正在编写的代码可能会用于其他应用程序。 - Jonathan
啊,你说得对,这里没有常量(我复制了一些抓取不同键的现有代码)。但原始字符串应该没问题。 - David Dunham
1
在我的 Info.plist 文件中添加了 Bundle display name 属性后,这对我起作用了。 - pasql
6
不是CFBundleDisplayName,而是CFBundleName。不要被欺骗。 - LKM
1
这要看情况。请查阅 CFBundleDisplayName 的文档。 - David Dunham
感谢 @pasql,我在我的 Info.plist 中缺少 Bundle 显示名称属性,因此我从 bundle 中获取了 null。 - orchidrudra

29

Swift 3 & 4

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

Swift 2.2

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


关于 'CFBundleName' 和 'CFBundleDisplayName' 的更多信息

下面内容摘自 苹果公司的 Core Foundation Keys 文档

CFBundleName,“Bundle 名称”,bundle 的简短名称,不打算让用户看到。有关详细信息,请参见CFBundleName(推荐使用,可本地化)。

CFBundleDisplayName,“Bundle 显示名称”,bundle 的用户可见名称;Siri 使用并在 iOS 的主屏幕上显示。请参见CFBundleDisplayName获取详细信息。(必须使用,可本地化)


1
文档中提到CFBundleDisplayName是必需的键...此外,它说CFBundleName是“包的短名称;不打算供用户查看。” - David Dunham
谢谢@DavidDunham!我已经更新了我的回答中“关于'CFBundleName'和'CFBundleDisplayName'的更多信息”的文本,以匹配苹果当前的文档。 - Mobile Dan
好奇心:如果这段代码可能为空,为什么要使用它,而不是直接使用默认值呢? - user5306470

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

14

我喜欢Xcode 4.5获取数组元素的新方法。

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

1
这是什么神奇操作?我不知道你可以像这样做。 - Pochi
Swift 中是否存在这个? - user5306470

8

对于 Xamarin.iOS,请使用:

return ((NSString)NSBundle.MainBundle.InfoDictionary["CFBundleName"]).ToString();

8
#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

6

Swift 3, 4, & 5

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

5

Swift 3/4

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

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

这里有一篇很好的文章,与你所寻找的内容有关。虽然原帖没有被采纳,但这些答案仍然很有用。链接:https://stackoverflow.com/a/2628511/59017

谢谢,那篇文章中有一些很棒的信息。不过我更喜欢David回答中的一行代码 ;) +1 - Jonathan

1

注意

如果您在应用程序中进行本地化,您应该使用以下代码来获取真正的本地化显示名称:

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

而不是:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接