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

the*_*end 20 cocoa-touch uiapplication nsbundle ios

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

Sie*_*ult 16

接受的答案对我不起作用,我正在使用Xcode 5的Images.xcassets方法存储应用程序图标.这个修改对我有用:

UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"]  objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)

如有疑问,只需使用lldb浏览主要包的infoDictionary.

  • 短一点:`UIImage *appIcon = [UIImage imageNamed:[[NSBundle mainBundle].infoDictionary[@"CFBundleIcons"][@"CFBundlePrimaryIcon"][@"CFBundleIconFiles"] firstObject]];` (2认同)

Con*_*has 13

我的答案完全基于moosgummi's,但返回了UIImage.

UIImage *appIcon = [UIImage imageNamed: [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)

所述UIImage自动选择合适的版本(正常,@2x,~ipad,~ipad@2x或任何未来的后缀).(顺便说一句,难道你不是只是讨厌识别图像版本的这个愚蠢的方案吗?它刚刚失控.感谢上帝的资产目录!)

  • 如果使用.xcassets,这在Xcode 5中不起作用 (6认同)
  • 是的,这不再适用了. (2认同)

Cod*_*der 11

这是一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

要访问该图标,请调用以下内容:

let icon = UIApplication.shared.icon
Run Code Online (Sandbox Code Playgroud)

对于奖励积分,如果您的应用需要,您甚至可以制作两个变量以获得最小和最大的图标.


sam*_*ize 10

适用于Swift 4.1,并将其扩展为Bundle。

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
    }
}
Run Code Online (Sandbox Code Playgroud)

要在应用中使用,请致电Bundle.main.icon

  • 这给了我仅 AppIcon60x60(在 iPhone7 上运行)或 AppIcon76x76(在 iPadPro 12.9" 第 4 代上运行)模拟器。是否有其他方法以更高分辨率访问图像?我拥有最大 1024pt 的所有尺寸在我的资产中。 (2认同)
  • 这仍然只能给我 iPhone 上的 60x60pt 大小。整个“icons”字典只为我返回小尺寸。有没有办法访问 1024px App Store 图标大小?我使用的是 Xcode 14.3 和 iOS 16。 (2认同)

Sum*_*mit 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;
        };
    };
Run Code Online (Sandbox Code Playgroud)

如果您想获取应用程序图标,请使用以下代码:

UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)

PS:UIImage会自动为视网膜显示选择合适的图标.

我希望它有所帮助!!


Ben*_*air 9

如果您使用资产目录,那么您可以简单地使用:

UIImage* appIcon = [UIImage imageNamed:@"AppIcon60x60"];

资产目录似乎标准化了应用程序图标的文件名.

当然,如果您需要列出捆绑中的所有应用程序图标,您可以在CFBundleIconFiles信息词典的分支中查找它.

使用KVC,您可以轻松地在一行代码中获得:

NSArray* allIcons = [[[NSBundle mainBundle] infoDictionary] valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"];
Run Code Online (Sandbox Code Playgroud)

生成的数组将包含捆绑包中可用的所有应用程序图标名称.任何这些名称都可用于检索图标+[UIImage imageNamed:]

<__NSCFArray 0x15d54260>(
    AppIcon29x29,
    AppIcon40x40,
    AppIcon60x60
)
Run Code Online (Sandbox Code Playgroud)


dom*_*dom 8

这很容易,因为当前图标的文件名在Info.plist中设置:

NSString *filePath = [[NSString alloc] initWithString:[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];
Run Code Online (Sandbox Code Playgroud)

如果您想选择高分辨率版本,您应该使用:

NSString *filePath = nil;    
for (NSString *fileName in [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"]) {
    if ([fileName rangeOfString:@"@2x"].location != NSNotFound) {
        filePath = [[NSString alloc] initWithString:fileName];
    }
}
Run Code Online (Sandbox Code Playgroud)


Jes*_*ock 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)
Run Code Online (Sandbox Code Playgroud)