有没有办法在可可触摸应用中获取当前的应用程序图标? 谢谢。
答案 0 :(得分:16)
接受的答案对我不起作用,我正在使用Xcode 5的Images.xcassets存储应用程序图标的方法。这个修改对我有用:
UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
如有疑问,请使用lldb探索主要包的infoDictionary。
答案 1 :(得分:13)
我的答案完全基于moosgummi
's,但却改为UIImage
。
UIImage *appIcon = [UIImage imageNamed: [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
UIImage
会自动选择合适的版本(普通,@2x
,~ipad
,~ipad@2x
或任何后续后缀。 (顺便说一句,难道你不是只讨厌识别图像版本的这个愚蠢的方案吗?它只是失控。感谢上帝的资产目录!)
答案 2 :(得分:9)
这是在info.plist中设置图标的方式,
//try doing NSLog(@"%@",[[NSBundle mainBundle] infoDictionary]);
CFBundleIcons = {
CFBundlePrimaryIcon = {
CFBundleIconFiles = (
"icon.png",//App icon added by you
"icon@2x.png"//App icon in retina added by you
);
UIPrerenderedIcon = 1;
};
};
如果您想使用以下代码获取应用图标:
UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
P.S:UIImage会自动为视网膜显示选择合适的图标。
我希望它有所帮助!!
答案 3 :(得分:9)
这是 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
对于奖励积分,如果您的应用需要,您甚至可以制作两个vars来获取最小和最大的图标。
答案 4 :(得分:8)
这很简单,因为当前图标的文件名在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];
}
}
答案 5 :(得分:8)
如果您使用资产目录,那么您只需使用:
UIImage* appIcon = [UIImage imageNamed:@"AppIcon60x60"];
资产目录似乎标准化了应用图标的文件名。
当然,如果您需要列出捆绑中的所有应用程序图标,您可以在信息词典的CFBundleIconFiles
分支中查找。
使用KVC,您可以在一行代码中轻松获得:
NSArray* allIcons = [[[NSBundle mainBundle] infoDictionary] valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"];
生成的数组将包含捆绑包中可用的所有应用程序图标名称。任何这些名称都可用于使用+[UIImage imageNamed:]
<__NSCFArray 0x15d54260>(
AppIcon29x29,
AppIcon40x40,
AppIcon60x60
)
答案 6 :(得分:6)
因为我需要一段时间才能解决问题,这是一个有效的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)
答案 7 :(得分:6)
适用于 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
。
答案 8 :(得分:2)
如果你正在使用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);
基于Andy's answer使用KVC方法。位冗长,但使用KeyPath比链接对ValueForKey的调用更好。
答案 9 :(得分:1)
@samwize 提供的答案是正确的,对于 SwiftUI 来说应该是:
Image(uiImage: Bundle.main.icon ?? UIImage())
答案 10 :(得分:1)
为了澄清起见,这是您按照上述示例查询 CFBundleIcon 字典时得到的结果:
X-Forwarded-Prefix
不幸的是,只返回了两个值。一个是我的 iPhone Mini 上的 (key: "CFBundlePrimaryIcon", value: {
CFBundleIconFiles = (
AppIcon60x60
);
CFBundleIconName = AppIcon;
})
,另一个是 AppIcon60x60
更小!
有人有其他提示吗?