Как получить значок текущего приложения в ios - PullRequest
20 голосов
/ 23 февраля 2012

Есть ли способ получить значок текущего приложения в приложении Cocoa-Touch?Спасибо.

Ответы [ 9 ]

16 голосов
/ 18 апреля 2014

Принятый ответ не работает для меня, я использую метод Images.xcassets Xcode 5 для хранения значков приложений.Эта модификация работала для меня:

UIImage *appIcon = [UIImage imageNamed: [[[[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIcons"] objectForKey:@"CFBundlePrimaryIcon"] objectForKey:@"CFBundleIconFiles"]  objectAtIndex:0]];

Если есть сомнения, просто изучите infoDictionary основного пакета, используя lldb.

13 голосов
/ 10 июня 2012

Я полностью основал свой ответ на moosgummi , но вместо этого возвратил UIImage.

UIImage *appIcon = [UIImage imageNamed: [[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleIconFiles"] objectAtIndex:0]];

UIImage автоматически выбирает подходящую версию (нормальная,@2x, ~ipad, ~ipad@2x или любой будущий суффикс).(Кстати, разве вы не ненавидите эту глупую схему для идентификации версий изображений? Она просто выходила из-под контроля. Слава богу за каталоги активов!)

10 голосов
/ 05 июля 2016

Вот расширение 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

Для получения бонусных баллов вы можете даже сделать две переменные, чтобы получить наименьший и самый большой значок, если оно требуется вашему приложению.

9 голосов
/ 26 марта 2013

Вот так иконки устанавливаются в 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 автоматически выбирает подходящий значок для отображения сетчатки.

Надеюсь, это поможет !!

8 голосов
/ 30 ноября 2014

Если вы используете каталоги активов, то вы можете просто использовать:

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

Каталоги активов, кажется, стандартизируют имена файлов для значков приложений.

Конечно, если вам нужно перечислить все значки приложений в вашем комплекте, вы можете посмотреть их в CFBundleIconFiles ветви информационного словаря.

Используя KVC, вы можете легко получить это в одной строке кода:

NSArray* allIcons = [[[NSBundle mainBundle] infoDictionary] valueForKeyPath:@"CFBundleIcons.CFBundlePrimaryIcon.CFBundleIconFiles"];

Результирующий массив будет содержать все имена значков приложений, доступных в вашем комплекте. Любое из этих имен может быть использовано для получения значка, используя +[UIImage imageNamed:]

<__NSCFArray 0x15d54260>(
    AppIcon29x29,
    AppIcon40x40,
    AppIcon60x60
)
8 голосов
/ 23 февраля 2012

Это просто, потому что имя файла текущего значка задано в 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];
    }
}
6 голосов
/ 09 июля 2018

Работает для 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
    }
}

Чтобы использовать в приложении, звоните Bundle.main.icon.

6 голосов
/ 21 февраля 2015

Поскольку я потратил немного времени на разработку, вот работающее решение 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)
2 голосов
/ 07 июля 2016

Если вы используете 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.

...