Site icon AppTractor

Динамическое изменение иконки приложения в iOS

C iOS 10.3 Apple запустила для разработчиков возможность менять иконку приложения не только при заливке нового билда, но и при помощи кода. Хотя эта функция не такая гибкая, как в официальном приложении “Часы” с двигающимися стрелками, на основе неё можно создать отличную динамику. Давайте посмотрим, как это работает.

Теория

В документе Apple API стоит взглянуть на три вещи:

var supportsAlternateIcons: Bool { get }
var alternateIconName: String? { get }
func setAlternateIconName(String?, completionHandler: ((Error?) -> Void)? = nil)

Больше деталей — на официальной странице Apple API. Давайте зайдем в Xcode и начнем.

Подготовка

Сделаем три изображения с иконками: pichu.png, pikachu.png, raichu.png. Изображения бесполезно размещать в папке Assets, нужно поместить их в директорию проекта. Вот мой пример:

Затем нам нужно подготовить info.plist:

  1. Добавьте файлы иконок в Information Property List.
  2. Добавьте CFBundleAlternateIcons как словарь.
  3. Добавьте 3 вложенных словаря в CFBundleAlternateIcons: pichu, pikachu и raichu.
  4. Для каждого массива нужно определить два свойства: 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")
        }
})
}

 


  1. Проверьте, поддерживает ли приложение альтернативные иконки.
  2. Измените иконку на конкретное изображение с соответствующим названием.
  3. После изменения иконки выведите сообщение с ошибкой или успешным завершением.

Запустите приложение и наслаждайтесь шоу.

Exit mobile version