如何在ios中获取当前的应用程序图标

时间:2012-02-23 18:49:00

标签: ios cocoa-touch nsbundle uiapplication

有没有办法在可可触摸应用中获取当前的应用程序图标? 谢谢。

11 个答案:

答案 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 更小!

有人有其他提示吗?