왕논의 연구실

[Swift]동적 아이콘 변경 본문

iOS/Swift

[Swift]동적 아이콘 변경

ywangnon 2021. 9. 22. 04:53

ios 10.3 이상에서만 사용할 수 있는 기능입니다.

 

변경할 아이콘을 Assets가 아닌 프로젝트 폴더에 넣습니다.

 

그리고 Info.plist에 변경할 아이콘에 대한 정보를 입력합니다.

 

 

소스코드로는 이렇습니다.

 

	<key>CFBundleIcons</key>
	<dict>
		<key>CFBundleAlternateIcons</key>
		<dict>
			<key>Theme1</key>
			<dict>
				<key>CFBundleIconFiles</key>
				<array>
					<string>Theme1</string>
				</array>
			</dict>
			<key>Theme2</key>
			<dict>
				<key>CFBundleIconFiles</key>
				<array>
					<string>Theme2</string>
				</array>
			</dict>
		</dict>
	</dict>

 

이제 앱의 아이콘을 변경할 부분에서 다음 코드를 입력합니다.

 

UIApplication.shared.setAlternateIconName("Theme1") { (error) in
    debugPrint("error \(error)")
}

 

그리고 앱을 변경할 때마다 경고창을 띄워줍니다.

 

 

사실 앱 만들때 이 경고창이 안 보여서 왜 안보이나 고민했었는데요.

알고보니 앱 아이콘을 선택하면서 앱 아이콘을 바꾸고, 바로 화면을 dismiss해서 팝업창이 안 보인 것이었습니다.

 

앱 아이콘이 변경되지 않는 경우가 몇가지 있다고 하는데요.

제가 실제 테스트해보면서 찾은 것도 추가적으로 적어보겠습니다.

 

1. 메인 스레드에서 호출하지 않은 경우

이 경우 에러코드 3072를 호출한다고 합니다.

 

이경우

DispatchQueue.main.async {
  UIApplication.shared.setAlternateIconName("jeongja") { (error) in
    debugPrint("error \(error)")
  }
}

이처럼 메인에서 실행되도록 수정합니다.

 

2. 앱이 foreground에서 실행중이지 않을 때

사용자 몰래 아이콘을 변경을 막는 조치.

 

3. 아이패드를 지원하는 경우, 아이콘 이미지 이름이 형식에 맞지 않을 때

애플 파일 이름 규칙 문서를 보시면 파일 크기에 따라 이름 지정하는 방식이 정해져 있습니다.

아이폰의 경우에는 위에 쓴 것처럼 지정할 이름에 자기가 이름을 지정해서 사용할 수 있는데 아이패드는 이름 형식을 맞춰야 합니다.

 

4. 아이폰이 자원을 많이 사용하고 있는 경우

위에 3개는 인터넷에서 찾은 자료인데요. 4번은 제가 테스트하면서 찾은 오류입니다.

 

이때는 background에 돌려진 앱을 모두 꺼주시고, 기기를 재시작해보는 것을 추천합니다.

 

제가 테스트할 때, 코드도 제대로 작성했고 이미지도 넣었는데 아이콘이 바로바로 변경되지가 않았습니다. 또한 이상한게 오류를 찾기 위해서 반복해서 기기에 실행시키는 처음에만 실행시키기 전에 눌렀던 아이콘에 맞춰서 변경하였습니다.

 

계속 오류를 찾다가 혹시 아이콘을 바꾸는 다른 앱은 제대로 작동 되나? 싶어서 실행해보니 그것들도 제대로 작동하지 않았습니다. 모든 앱이 같은 기능을 제대로 실행하지 못한다면 기기문제라고 생각하여 모든 앱을 종료하고 기기도 재부팅하니 제대로 작동하였습니다.