Как получить текущий значок приложения в 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.