Як отримати назву запущеної програми в iOS


78

Якщо ім'я програми під піктограмою на головному екрані "My Awesome App", як отримати цей рядок у програмі під час виконання?

Відповіді:


134

Я б спробував

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

хоча, мабуть, ви знаєте назву власного додатка і можете просто використовувати його ...


5
Це працює, хоча константа не існує. Здогадуючись, це @ "CFBundleDisplayName". Я не хочу жорстко кодувати назву програми, оскільки код, який я пишу, може використовуватися в інших програмах.
Джонатан,

Ах, ти маєш рацію, константи немає (я скопіював якийсь існуючий код, який схопив інший ключ). Хоча сира струнка повинна бути тонкою.
Девід Данхем,

Це спрацювало для мене після того, як я додав Bundle display nameвластивість у свій Info.plistфайл.
pasql

5
не CFBundleDisplayName, а CFBundleName. Не обманюйте
LKM

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 - це «коротка назва пакета; не призначений для перегляду користувачем ".
Девід Данхем,

Дякую @DavidDunham! Я оновив текст у своїй відповіді в розділі "Докладніше про" CFBundleName "та" CFBundleDisplayName "", щоб відповідати поточній документації Apple.
Mobile Dan

Цікавість: Який сенс використовувати цей код, якщо він може бути нульовим і слід вказати значення за замовчуванням? Чому б просто не використовувати це значення?
Даніель Спрінгер,

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

14

Просто тому, що я люблю Xcode 4.5 новий спосіб отримати елемент масиву. :)

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

1
що це за чаклунство? Я не знав, що ти можеш зробити це так.
Почі

Чи існує це в 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

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

Ось хороший допис із прикладами того, що ви шукаєте. ОП нічого не прийняв, що шкода, але відповіді корисні.


Дякую, чудова інформація в цьому дописі. Віддайте перевагу одному лайнеру у відповіді Девідса;) +1
Джонатан,

1

Увага :

Якщо ви робите це localizationsу своєму додатку, вам слід скористатись продутим кодом, щоб отримати справжнє локалізоване відображуване ім'я:

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

а не :

Bundle.main.object(forInfoDictionaryKey: kCFBundleNameKey as String) as? String
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.