회사에서 계절별로 앱 아이콘을 다르게 적용하기로 결정
하지만 매번 앱 아이콘을 변경하여 배포하는 것은 비효율적이라고 판단 코드로 동적 변경하는 방법을 찾았음
UIApplication의 setAlternateIconName 메서드를 이용해 변경 가능기존 블로그에서는 Info.plist에 추가하고 이미지를 앱 내 파일로 복사하여 사용했지만, 저는 Asset Catalog를 이용하여 구현
AppIcon은 그대로 유지SpringAppIcon, SummerAppIcon, FallAppIcon, WinterAppIcon 추가
UIApplication.shared.setAlternateIconName("SpringAppIcon")
UIApplication.shared.setAlternateIconName("SummerAppIcon")
UIApplication.shared.setAlternateIconName("FallAppIcon")
UIApplication.shared.setAlternateIconName("WinterAppIcon")
UIApplication.shared.setAlternateIconName(nil) // 기본 앱 아이콘으로 변경
nil을 설정하면 기본 아이콘으로 변경_setAlternateIconName:completionHandler:를 직접 호출func setIconWithoutAlert(_ appIconName: String) {
if let alternateIconName = UIApplication.shared.alternateIconName, alternateIconName == appIconName {
return
}
if UIApplication.shared.responds(to: #selector(getter: UIApplication.supportsAlternateIcons)) && UIApplication.shared.supportsAlternateIcons {
typealias setAlternateIconName = @convention(c) (NSObject, Selector, NSString, @escaping (NSError) -> ()) -> ()
let selectorString = "_setAlternateIconName:completionHandler:"
let selector = NSSelectorFromString(selectorString)
let imp = UIApplication.shared.method(for: selector)
let method = unsafeBitCast(imp, to: setAlternateIconName.self)
method(UIApplication.shared, selector, appIconName as NSString, { _ in })
}
}
DefaultAppIcon을 하나 더 만들어야 함 AppIcon을 사용하면 변경이 되지 않는 문제가 발생 func setAppIcon() {
let currentMonth = Calendar.current.component(.month, from: Date())
var iconName: String = "DefaultAppIcon"
switch currentMonth {
case 3, 4, 5: iconName = "SpringAppIcon"
case 6, 7, 8: iconName = "SummerAppIcon"
case 9, 10, 11: iconName = "FallAppIcon"
case 12, 1, 2: iconName = "WinterAppIcon"
default: break
}
setIconWithoutAlert(iconName)
}
setAlternateIconName을 사용하면 앱 아이콘을 동적으로 변경 가능_setAlternateIconName:completionHandler:를 사용해야 함DefaultAppIcon을 추가해야 함생각보다 간단한 방법으로 앱 아이콘을 변경할 수 있었음!