- Notifications
You must be signed in to change notification settings - Fork 0
Home
junbok97 edited this page Apr 19, 2025
·
12 revisions
Dynamic App Icon
특정기간이나 특정 조건에서 앱 아이콘을 바꾸고 싶을 때 앱 배포를 하지 않고 앱 아이콘을 바꾸는 방법
Assets 에 원하는 AppIcon(BIcon, CIcon, DIcon) 들을 추가

Targets → Build Setting(All) → Alternate App Icon Sets 에서 Assets에 추가한 AppIcon(BIcon, CIcon, DIcon) 들을 입력

UIApplication.shared.setAlternateIconName(string:) 호출
Simulator.Screen.Recording.-.iPhone.16.Pro.-.2025-04-20.at.00.01.48.mp4
import UIKit
classViewController:UIViewController{overridefunc viewDidLoad(){
super.viewDidLoad()}@IBActionfunc buttonTapped(_ sender:Any){setAppIcon()}func setAppIcon(){letcount=(UserDefaults.standard.integer(forKey:"AppIcon")+1)%4UserDefaults.standard.setValue(count, forKey:"AppIcon")variconName:String?=nilswitch count {case1:
iconName ="BIcon"case2:
iconName ="CIcon"case3:
iconName ="DIcon"default:break}UIApplication.shared.setAlternateIconName(iconName){ error iniflet error = error {print("아이콘 변경 실패: \(error)")}else{print("아이콘 변경 성공!")}}}}alert이 뜨는게 싫다면 아래 함수 호출 주의해야할 점은 appStore 심사가 거절될 수 있고 UIApplication.shared.setAlternateIconName에선 nil로 값을 주면 기본으로 설정된 appIcon으로 돌아가는데 setIconWithoutAlert을 사용할 경우엔 기본으로 돌아갈 appIcon을 따로 추가해주어야 함
func setIconWithoutAlert(_ appIconName:String){iflet alternateIconName =UIApplication.shared.alternateIconName,
alternateIconName == appIconName {return}ifUIApplication.shared.responds(to: #selector(getter: UIApplication.supportsAlternateIcons)) && UIApplication.shared.supportsAlternateIcons {typealiassetAlternateIconName=@convention(c)(NSObject,Selector,NSString,@escaping(NSError)->())->()letselectorString="_setAlternateIconName:completionHandler:"letselector=NSSelectorFromString(selectorString)letimp=UIApplication.shared.method(for: selector)letmethod=unsafeBitCast(imp, to: setAlternateIconName.self)method(UIApplication.shared, selector, appIconName asNSString,{ _ in})}}간혹가다 icon 변경이 안될때는 assets 이미지 이름에 icon(ex: special -> specialIcon)을 붙혀 적용해보면 변경됨