Swiftでアプリケーション名を取得するにはどうすればよいですか?
グーグルは私にこれを与えました:
[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleName"];
Swiftに変換しました。エラー-メソッドが存在しません:
NSBundle.mainBundle().infoDictionary.objectForKey("CFBundleName")
これは動作するはずです:
NSBundle.mainBundle().infoDictionary!["CFBundleName"] as! String
infoDictionary
はvar infoDictionary: [NSObject : AnyObject]!
として宣言されているため、アンラップする必要があり、Swift辞書(objectForKey
を使用するのではなく)としてアクセスする必要があります。結果はAnyObject
であり、キャストします。
更新Swift 3(Xcode 8ベータ2)
可能な場合は常に定数を使用することをお勧めします。
Bundle.main.infoDictionary![kCFBundleNameKey as String] as! String
このソリューションはよりエレガントだと思います。さらに、object(forInfoDictionaryKey:)
を使用すると Appleが推奨 :
「キーのローカライズされた値が使用可能な場合にそれを返すため、このメソッドの使用は他のアクセス方法よりも優先されます。」
extension Bundle {
var displayName: String? {
return object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
}
}
バンドルの表示名へのアクセス:
if let displayName = Bundle.main.displayName {
print(displayName)
}
ホーム画面のアイコンの下に表示されるアプリ名を取得するための簡単な拡張機能を作成しました。
デフォルトでは、アプリには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
Swift 4
let appName = Bundle.main.object(forInfoDictionaryKey: "CFBundleDisplayName") as! String
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
これはあなたが探しているものに似ているはずです:
let infoDictionary: NSDictionary = NSBundle.mainBundle().infoDictionary as NSDictionary!
let appName: NSString = infoDictionary.objectForKey("CFBundleName") as NSString
NSLog("Name \(appName)")
これを行うためのより良い方法があるかもしれませんが、少なくとも私の非常に限られたテストでアプリ名を正しく返します...
let appDisplayName = Bundle.main.infoDictionary?["CFBundleName"] as? String
これはオプションなので、if letまたはguardステートメントに入れてください。
バンドルにCFBundleName
があるかのように、単にCFBundleDisplayName
を返すすべての回答は、ユーザーが期待する名前を返さないことがよくあり、このキーはFinder、システムフレームワーク、および他のほとんどのアプリによって表示されます。
ほとんどの回答は情報ディクショナリに直接アクセスしますが、情報ディクショナリは文字列ファイルによってローカライズできます。直接アクセスすると、このローカライズも無視され、Finderがローカライズされた名前を表示するため、再び間違った名前が返される場合があります。
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)
}
_
このソリューションはどのように優れていますか?
最初にCFBundleDisplayName
をチェックし、存在しない場合にのみCFBundleName
にフォールバックします。
object()
メソッドは、常に情報辞書のローカライズされたバージョンで動作するため、ローカリゼーションが存在する場合は自動的に使用されます。
CFBundleDisplayName
もCFBundleName
もディクショナリに存在しない場合、コードは、拡張子のないディスク上のバンドルファイル名を使用するだけにフォールバックします(「My Cool App.app」は「My Cool App」になります) 、これはフォールバックであるため、この関数はnil
を決して返しません。
これを試して:
extension Bundle {
var displayName: String {
let name = object(forInfoDictionaryKey: "CFBundleDisplayName") as? String
return name ?? object(forInfoDictionaryKey: kCFBundleNameKey as String) as! String
}
}
//アプリの名前を返します
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
}
let bundleInfoDict: NSDictionary = NSBundle.mainBundle().infoDictionary!
let appName = bundleInfoDict["CFBundleName"] as String
これは私にぴったりです
let appName = NSBundle.mainBundle().objectForInfoDictionaryKey("CFBundleDisplayName") as! String
これを試して、
let bundleID = NSBundle.mainBundle().bundleIdentifier