Как получить текущий значок приложения в ios

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

Ответы

Ответ 1

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

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

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

Ответ 2

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

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

Если у вас есть сомнения, просто ознакомьтесь с основным информационным словом bundle, используя lldb.

Ответ 3

Вот как значки установлены внутри 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]];

P.S: UIImage автоматически выбирает подходящий значок для отображения сетчатки.

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

Ответ 4

Это легко, потому что имя файла текущего значка установлено в 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

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

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

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

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

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

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

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

<__NSCFArray 0x15d54260>(
    AppIcon29x29,
    AppIcon40x40,
    AppIcon60x60
)

Ответ 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

Ниже приведено расширение Swift 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, чтобы получить самый маленький и самый большой значок, если это нужно вашему приложению.

Ответ 8

Если вы используете 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 answer, используя метод KVC. Бит длительный, но с использованием KeyPath лучше, чем цепочки вызовов ValueForKey.