Cocoa-touchアプリで現在のアプリケーションアイコンを取得する方法はありますか?ありがとうございました。
Swift 4.1で動作し、バンドル用に拡張します。
extension Bundle {
public var icon: UIImage? {
if let icons = infoDictionary?["CFBundleIcons"] as? [String: Any],
let primaryIcon = icons["CFBundlePrimaryIcon"] as? [String: Any],
let iconFiles = primaryIcon["CFBundleIconFiles"] as? [String],
let lastIcon = iconFiles.last {
return UIImage(named: lastIcon)
}
return nil
}
}
アプリで使用するには、Bundle.main.icon
に電話してください。
受け入れられた答えは私にはうまくいきませんでした、私はアプリのアイコンを保存するためにXcode5のImages.xcassetsメソッドを使用しています。この変更は私のために働いた:
UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
疑わしい場合は、lldbを使用してメインバンドルのinfoDictionaryを調べてください。
これがSwift 4.x && 3.xアプリケーションアイコンを取得するためのUIApplication
の拡張です。 iconFiles
配列からプルしたアイコンパスの場所に基づいて、最小または最大のアイコンを取得するかどうかを選択できます。
extension UIApplication {
var icon: UIImage? {
guard let iconsDictionary = Bundle.main.infoDictionary?["CFBundleIcons"] as? NSDictionary,
let primaryIconsDictionary = iconsDictionary["CFBundlePrimaryIcon"] as? NSDictionary,
let iconFiles = primaryIconsDictionary["CFBundleIconFiles"] as? NSArray,
// First will be smallest for the device class, last will be the largest for device class
let lastIcon = iconFiles.lastObject as? String,
let icon = UIImage(named: lastIcon) else {
return nil
}
return icon
}
}
アイコンにアクセスするには、次の電話番号を呼び出します。
let icon = UIApplication.shared.icon
ボーナスポイントについては、アプリで必要な場合は、2つの変数を作成して最小と最大のアイコンを取得することもできます。
私は答えを完全に moosgummi
's に基づいていますが、代わりにUIImage
を返します。
UIImage *appIcon = [UIImage imageNamed: [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
UIImage
は、適切なバージョンを自動的に選択します(通常、@2x
、~ipad
、~ipad@2x
または将来の接尾辞)。 (ところで、画像のバージョンを識別するためのこのばかげたスキームが嫌いではありませんか?それは手に負えなくなっていました。アセットカタログを神に感謝します!)
これは、info.plist内でアイコンが設定される方法です。
//try doing NSLog(@"%@",[[NSBundle mainBundle] infoDictionary]);
CFBundleIcons = {
CFBundlePrimaryIcon = {
CFBundleIconFiles = (
"icon.png",//App icon added by you
"[email protected]"//App icon in retina added by you
);
UIPrerenderedIcon = 1;
};
};
アプリアイコンを取得したい場合は、以下のコードを使用してください。
UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
追伸:UIImageは、網膜表示に適したアイコンを自動的に選択します。
お役に立てば幸いです!!
アセットカタログを使用する場合は、次のものを使用できます。
UIImage* appIcon = [UIImage imageNamed:@"AppIcon60x60"];
アセットカタログは、アプリアイコンのファイル名を標準化しているようです。
確かに、バンドル内のすべてのアプリアイコンを一覧表示する必要がある場合は、情報辞書のCFBundleIconFiles
ブランチで検索できます。
KVCを使用すると、1行のコードで簡単に取得できます。
NSArray* allIcons = [[[NSBundle mainBundle] infoDictionary] valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"];
結果の配列には、バンドルで使用可能なすべてのアプリアイコン名が含まれます。これらの名前はいずれも、+[UIImage imageNamed:]
を使用してアイコンを取得するために使用できます。
<__NSCFArray 0x15d54260>(
AppIcon29x29,
AppIcon40x40,
AppIcon60x60
)
現在のアイコンのファイル名はInfo.plistで設定されているため、これは簡単です。
NSString *filePath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
高解像度バージョンを選択する場合は、次を使用する必要があります。
NSString *filePath = nil;
for (NSString *fileName in [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"]) {
if ([fileName rangeOfString:@"@2x"].location != NSNotFound) {
filePath = [[NSString alloc] initWithString:fileName];
}
}
解決するのに少し時間がかかったので、これが実用的なSwiftソリューションです。
let primaryIconsDictionary = NSBundle.mainBundle().infoDictionary?["CFBundleIcons"]?["CFBundlePrimaryIcon"] as? NSDictionary
let iconFiles = primaryIconsDictionary!["CFBundleIconFiles"] as NSArray
let lastIcon = iconFiles.lastObject as NSString //last seems to be largest, use first for smallest
let theIcon = UIImage(named: lastIcon)
let iconImageView = UIImageView(image: theIcon)
Xamarinを使用している場合:
var iconNames = NSBundle.MainBundle.InfoDictionary.ValueForKeyPath((NSString)"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles") as NSArray;
var name = iconNames.GetItem<NSString>(iconNames.Count - 1); //Grabs last item, call with 0 for the first item
var icon = UIImage.FromBundle(name);
アンディの答え に基づいてKVCメソッドを使用します。少し長いですが、KeyPathを使用する方が、ValueForKeyへの呼び出しを連鎖させるよりも優れています。