[iOS] 앱 아이콘 동적으로 변경하기

pola·2025년 1월 31일

Company

목록 보기
3/7

회사에서 계절별로 앱 아이콘을 다르게 적용하기로 결정
하지만 매번 앱 아이콘을 변경하여 배포하는 것은 비효율적이라고 판단 코드로 동적 변경하는 방법을 찾았음

앱 아이콘 변경 방법

  • UIApplication의 setAlternateIconName 메서드를 이용해 변경 가능
  • iOS 10.3 이상 버전에서만 지원

기존 블로그에서는 Info.plist에 추가하고 이미지를 앱 내 파일로 복사하여 사용했지만, 저는 Asset Catalog를 이용하여 구현

Asset 설정

  • 기본 AppIcon은 그대로 유지
  • SpringAppIconSummerAppIconFallAppIconWinterAppIcon 추가
  • 아래 사진처럼 설정
    picture

아이콘 변경 코드

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 추가 필요

  • 팝업 없이 변경하려면 DefaultAppIcon을 하나 더 만들어야 함
  • 기존 AppIcon을 사용하면 변경이 되지 않는 문제가 발생
  • 다음과 같은 구조로 Asset을 설정해야 합니다.
  1. AppIcon
  2. DefaultAppIcon
  3. SpringAppIcon
  4. SummerAppIcon
  5. FallAppIcon
  6. WinterAppIcon

계절별 자동 아이콘 변경 코드

  • 아래 코드를 통해 앱 실행 시 현재 계절에 맞게 자동으로 아이콘이 변경
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을 추가해야 함
  • 자동 변경을 위해 현재 날짜 기준으로 계절별 아이콘을 적용 가능

생각보다 간단한 방법으로 앱 아이콘을 변경할 수 있었음!

profile
pola

0개의 댓글