web-dev-qa-db-fra.com

Obtenir le nom de l'application dans Swift

Comment obtenir le nom de l'application dans Swift?

Googling m'a donné ceci:

[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];

Je l'ai converti en Swift; error - la méthode n'existe pas:

NSBundle.mainBundle().infoDictionary.objectForKey("CFBundleName")
39
Kaatt

Cela devrait fonctionner:

NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String

infoDictionary est déclaré en tant que var infoDictionary: [NSObject : AnyObject]! et vous devez donc le décompresser, y accéder en tant que dictionnaire Swift (plutôt que d'utiliser objectForKey) et, comme résultat, AnyObject, lancez-le.

Mise à jour de Swift 3 (Xcode 8 beta 2)

Il est toujours préférable d’utiliser des constantes lorsque cela est possible:

Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String
90
Grimxn

Je crois que cette solution est plus élégante. De plus, l'utilisation de object(forInfoDictionaryKey:) est encouragée par Apple :

"L'utilisation de cette méthode est préférable aux autres méthodes d'accès car elle renvoie la valeur localisée d'une clé lorsqu'elle est disponible."

extension Bundle {
    var displayName: String? {
        return object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
    }
}

Accéder au nom d'affichage du paquet: 

if let displayName = Bundle.main.displayName {
    print(displayName)
}
23
Vadim Bulavin

J'ai créé une simple extension pour obtenir le nom de l'application qui apparaît sous l'icône sur l'écran d'accueil.

Par défaut, les applications ont uniquement CFBundleName set. Certaines applications, cependant, définissent CFBundleDisplayName (nom visible par l'utilisateur du paquet) pour changer le titre sous l'icône de l'application. L'ajout d'espaces est souvent le cas, par exemple Le nom du paquet "ExampleApp" peut avoir un nom d'affichage du paquet défini sur "Example App".

extension Bundle {
    // Name of the app - title under the icon.
    var displayName: String? {
            return object(forInfoDictionaryKey: "CFBundleDisplayName") as? String ??
                object(forInfoDictionaryKey: "CFBundleName") as? String
    }
}

Usage:

let appName = Bundle.main.displayName
8
Marián Černý

manière simple: 

let appName = NSBundle.mainBundle().infoDictionary?[kCFBundleNameKey as String] as? String

moyen pratique:

extension NSBundle {
    class func mainInfoDictionary(key: CFString) -> String? {
        return self.mainBundle().infoDictionary?[key as String] as? String
    }
}
print(NSBundle.mainInfoDictionary(kCFBundleNameKey))

kCFBundleNameKey - Clé Info.plist standard, voir plus dans CFBundle

6
olsen

Même réponse dans Swift 4.2

extension Bundle {
    static func appName() -> String {
        guard let dictionary = Bundle.main.infoDictionary else {
            return ""
        }
        if let version : String = dictionary["CFBundleName"] as? String {
            return version
        } else {
            return ""
        }
    }
}

vous pouvez l'utiliser comme ci-dessous

let appName = Bundle.appName()

J'espère que cela t'aides :)

4

Cela devrait ressembler davantage à ce que vous recherchez:

let infoDictionary: NSDictionary = NSBundle.mainBundle().infoDictionary as NSDictionary!
let appName: NSString = infoDictionary.objectForKey("CFBundleName") as NSString

NSLog("Name \(appName)")

Il y a peut-être encore une meilleure façon de faire cela, mais au moins le nom de l'application est renvoyé correctement dans mes tests très limités ...

2
Dan Fairaizl
  1. Toutes les réponses qui ne font que renvoyer CFBundleName ne renverront souvent pas le nom attendu par l'utilisateur, comme si les ensembles avaient une CFBundleDisplayName, cette clé est ensuite affichée par le Finder, les environnements système et la plupart des autres applications.

  2. La plupart des réponses accèdent directement au dictionnaire d’informations, mais les dictionnaires d’informations peuvent être localisés à l’aide de fichiers de chaîne. Lors de leur accès direct, cette localisation est également ignorée et un nouveau nom erroné peut donc être renvoyé car le nom localisé sera affiché.

  3. Si CFBundleDisplayName est facultatif dans les fichiers Info.plist, CFBundleName ne l’est pas, mais si vous oubliez de l’ajouter, rien ne se cassera dans votre système. Vous avez donc un dict d’informations corrompu, mais la plupart des utilisateurs ne le remarqueront probablement jamais et la plupart des réponses peuvent ne rien retourner de significatif.

Voici ma solution (Swift 3):

private
func stripFileExtension ( _ filename: String ) -> String {
    var components = filename.components(separatedBy: ".")
    guard components.count > 1 else { return filename }
    components.removeLast()
    return components.joined(separator: ".")
}

func nameOfApp ( ) -> String {
    let bundle = Bundle.main
    if let name =  bundle.object(forInfoDictionaryKey: "CFBundleDisplayName")
        ?? bundle.object(forInfoDictionaryKey: kCFBundleNameKey as String),
        let stringName = name as? String
        { return stringName }

    let bundleURL = bundle.bundleURL
    let filename = bundleURL.lastPathComponent
    return stripFileExtension(filename)
}

Comment cette solution est-elle meilleure?

  1. Il va vérifier CFBundleDisplayName d'abord et ne retombera que pour CFBundleName s'il n'est pas présent.

  2. La méthode object() fonctionne toujours sur la version localisée du dictionnaire d’informations. Par conséquent, si une localisation existe, elle sera automatiquement utilisée.

  3. S'il n'y a ni CFBundleDisplayName ni CFBundleName dans le dictionnaire, le code revient simplement à utiliser le nom de fichier de l'ensemble sur le disque sans l'extension (donc "My Cool App.app" sera "My Cool App"), il s'agit alors d'une solution de repli la fonction ne retournera jamais nil.

2
Mecki

Essaye ça:

extension Bundle {
    var displayName: String {
        let name = object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
        return name ?? object(forInfoDictionaryKey: kCFBundleNameKey as String) as! String
    }
}
2
A. Poltoratskyi

// retourne le nom de l'application

public static var appDisplayName: String? {
    if let bundleDisplayName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as? String {
        return bundleDisplayName
    } else if let bundleName = Bundle.main.object(forInfoDictionaryKey: "CFBundleName") as? String {
        return bundleName
    }
    return nil
}
2
Pratyush Pratik
let bundleInfoDict: NSDictionary = NSBundle.mainBundle().infoDictionary!
let appName = bundleInfoDict["CFBundleName"] as String
1
zaph

Celui-ci fonctionne parfaitement pour moi

let appName = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleDisplayName") as! String
0
mstntsnr

Essaye celui-là,

let bundleID = NSBundle.mainBundle().bundleIdentifier
0
Christian