Свершилось, вышла новая iOS 10.3! Этого момента я ждал еще с 2012 года, а знаете почему? Присаживайтесь поудобнее, расскажу.
При заказа дизайна для своего приложения iFile, у дизайнера я просил две иконки: одну обычную, которая сейчас есть, а другую при выключенном приложении (выключенный экран). В надежде, что этот день когда-нибудь настанет, ведь в macOS это было уже давно!
Но не все так просто, Apple решили сильно не развязывать разработчикам руки и сделали вот такой метод в классе UIApplication:
func setAlternateIconName(_ alternateIconName: String?, completionHandler: ((Error?) -> Void)? = nil)
Что это значит? А значит то, что можно менять иконку приложения только на ту текстуру, которая была заранее добавлена в приложение при компиляции. То есть, если вы делаете календарь и хотите отображать число месяца, то придется готовить заранее 31 иконку. И это я не говорю о том, если вдруг вы захотите отображать сразу и число и день недели, сами понимаете как много надо будет содержать иконок.
Ко всему этому при смене иконки будет выводиться подобный алерт, что сводит к невозможности изменять иконку без уведомления об этом пользователя.
Собственно, Apple никогда не делает без причины, данное ограничение вызвано политикой безопасности и удобства для пользователей (вдруг вы захотите маскировать свое приложение под другое?). Думаю, единственный реальный юзер-кейс данной функции – предоставить пользователю настройку выбора понравившейся иконки.
Давайте рассмотрим функцию поподробнее.
Мы имеет в своем боекомплекте альтернативную иконку, которую хотим поставить, как и ее имя. Что примечательно Assets позволяют нам управлять отображением текстуры для разных устройств и размеров, поэтому в одной текстуре могут содержаться разные иконки, например, для iPhone и iPad.
Также, судя по наличию, completionHandler, метод работает асинхронно и иконка заменяется в фоновом режиме.
Чуть не забыл, для использования текстур в качестве иконки приложения, необходимо добавить ее наименование в Info.plist к цепочке ключей: CFBundleIcons -> CFBundleAlternateIcons. Таким образом вот пример содержимого Info.plist с использованием альтернативной иконки:
<key>CFBundleIcons</key> <dict> <key>CFBundlePrimaryIcon</key> <dict> <key>CFBundleIconFiles</key> <array> <string>AppIcon</string> </array> </dict> <key>CFBundleAlternateIcons</key> <dict> <key>MyAlternateIconName</key> <dict> <key>CFBundleIconFiles</key> <array> <string>AppIcon2</string> </array> <key>UIPrerenderedIcon</key> <false/> </dict> </dict> </dict>