C iOS 10.3 Apple запустила для разработчиков возможность менять иконку приложения не только при заливке нового билда, но и при помощи кода. Хотя эта функция не такая гибкая, как в официальном приложении “Часы” с двигающимися стрелками, на основе неё можно создать отличную динамику. Давайте посмотрим, как это работает.
Теория
В документе Apple API стоит взглянуть на три вещи:
var supportsAlternateIcons: Bool { get } var alternateIconName: String? { get } func setAlternateIconName(String?, completionHandler: ((Error?) -> Void)? = nil)
- supportsAlternateIcons — это свойство только для чтения, оно решает, может ли приложение менять иконку. Чтобы установить его как true, нам нужно добавить альтернативные иконки в файл info.plist.
- alternateIconName — также свойство только для чтения, это название текущей иконки приложения. Оно обозначено как nil. если приложение отображает первоначальную иконку.
- setAlternateIconName — функция, которая устанавливает отображаемую иконку. Если мы установим название на nil, приложение покажет первоначальную иконку.
Больше деталей — на официальной странице Apple API. Давайте зайдем в Xcode и начнем.
Подготовка
Сделаем три изображения с иконками: pichu.png, pikachu.png, raichu.png. Изображения бесполезно размещать в папке Assets, нужно поместить их в директорию проекта. Вот мой пример:
Затем нам нужно подготовить info.plist:
- Добавьте файлы иконок в Information Property List.
- Добавьте CFBundleAlternateIcons как словарь.
- Добавьте 3 вложенных словаря в CFBundleAlternateIcons: pichu, pikachu и raichu.
- Для каждого массива нужно определить два свойства: UIPrerenderedIcon и CFBundleIconFiles.
Больше деталей можно найти на странице Core Foundation Keys. Вот мой скриншот info.plist:
Пример кода
Предположим, у нас есть три кнопки. Нажмем на любую из них, чтобы приложение показывало соответствующую иконку.
// change app icon to "pichu" @IBAction func pichuButtonDidTap(_ sender: UIButton) { changeIcon(to: "pichu") } // change app icon to "pikachu" @IBAction func pikachuButtonDidTap(_ sender: UIButton) { changeIcon(to: "pikachu") } // change app icon to "raichu" @IBAction func raichuButtonDidTap(_ sender: UIButton) { changeIcon(to: "raichu") } func changeIcon(to iconName: String) { // 1 guard UIApplication.shared.supportsAlternateIcons else { return } // 2 UIApplication.shared.setAlternateIconName(iconName, completionHandler: { (error) in // 3 if let error = error { print("App icon failed to change due to \(error.localizedDescription)") } else { print("App icon changed successfully") } }) }
- Проверьте, поддерживает ли приложение альтернативные иконки.
- Измените иконку на конкретное изображение с соответствующим названием.
- После изменения иконки выведите сообщение с ошибкой или успешным завершением.
Запустите приложение и наслаждайтесь шоу.