web-dev-qa-db-ja.com

Swiftでアプリ名を取得

Swiftでアプリケーション名を取得するにはどうすればよいですか?

グーグルは私にこれを与えました:

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

Swiftに変換しました。エラー-メソッドが存在しません:

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

これは動作するはずです:

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

infoDictionaryvar infoDictionary: [NSObject : AnyObject]!として宣言されているため、アンラップする必要があり、Swift辞書(objectForKeyを使用するのではなく)としてアクセスする必要があります。結果はAnyObjectであり、キャストします。

更新Swift 3(Xcode 8ベータ2)

可能な場合は常に定数を使用することをお勧めします。

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

このソリューションはよりエレガントだと思います。さらに、object(forInfoDictionaryKey:)を使用すると Appleが推奨

「キーのローカライズされた値が使用可能な場合にそれを返すため、このメソッドの使用は他のアクセス方法よりも優先されます。」

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

バンドルの表示名へのアクセス:

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

ホーム画面のアイコンの下に表示されるアプリ名を取得するための簡単な拡張機能を作成しました。

デフォルトでは、アプリにはCFBundleNameのみが設定されています。ただし、一部のアプリでは、CFBundleDisplayName(ユーザーが認識できるバンドルの名前)を設定して、アプリアイコンの下のタイトルを変更します。多くの場合、スペースを追加します。バンドル名「ExampleApp」では、バンドル表示名を「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
    }
}

使用法:

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

Swift 4

let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String

7
Shan Ye

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 ""
        }
    }
}

以下のように使用できます

let appName = Bundle.appName()

お役に立てれば :)

簡単な方法:

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

便利な方法:

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

kCFBundleNameKey –標準Info.plistキー。詳細はCFBundle

6
olsen

これはあなたが探しているものに似ているはずです:

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

NSLog("Name \(appName)")

これを行うためのより良い方法があるかもしれませんが、少なくとも私の非常に限られたテストでアプリ名を正しく返します...

2
Dan Fairaizl
let appDisplayName = Bundle.main.infoDictionary?["CFBundleName"] as? String

これはオプションなので、if letまたはguardステートメントに入れてください。

2
Pepii15
  1. バンドルにCFBundleNameがあるかのように、単にCFBundleDisplayNameを返すすべての回答は、ユーザーが期待する名前を返さないことがよくあり、このキーはFinder、システムフレームワーク、および他のほとんどのアプリによって表示されます。

  2. ほとんどの回答は情報ディクショナリに直接アクセスしますが、情報ディクショナリは文字列ファイルによってローカライズできます。直接アクセスすると、このローカライズも無視され、Finderがローカライズされた名前を表示するため、再び間違った名前が返される場合があります。

  3. CFBundleDisplayNameは_Info.plist_ファイルではオプションですが、CFBundleNameは実際にはそうではありませんが、追加するのを忘れた場合、システムで破損することはないため、破損した情報辞書がありますほとんどのユーザーはおそらく気付かないでしょう。その場合、ほとんどの回答が意味のあるものをまったく返さないかもしれません。

これが私の解決策です(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)
}
_

このソリューションはどのように優れていますか?

  1. 最初にCFBundleDisplayNameをチェックし、存在しない場合にのみCFBundleNameにフォールバックします。

  2. object()メソッドは、常に情報辞書のローカライズされたバージョンで動作するため、ローカリゼーションが存在する場合は自動的に使用されます。

  3. CFBundleDisplayNameCFBundleNameもディクショナリに存在しない場合、コードは、拡張子のないディスク上のバンドルファイル名を使用するだけにフォールバックします(「My Cool App.app」は「My Cool App」になります) 、これはフォールバックであるため、この関数はnilを決して返しません。

2
Mecki

これを試して:

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

//アプリの名前を返します

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

これは私にぴったりです

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

これを試して、

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