이번 KMP 예제 프로젝트는 스플래시 스크린을 적용해보는 것이다.
iOS나 Android에서 Splash Screen(스플래시 화면)은 앱을 실행할 때 제일 먼저 잠깐 보여주는 화면. 사용자가 앱 아이콘을 눌러 앱을 시작하면 → 운영체제가 앱 프로세스를 띄우는 동안 → 흰 화면 대신 앱이 준비한 간단한 이미지/로고/배경을 보여주는 용도다.
먼저 안드로이드는 아래와 같은 의존성을 추가해야한다.
[versions]
#..
core-splashscreen = "1.0.1"
[libraries]
#...
core-splashscreen = { group = "androidx.core", name = "core-splashscreen", version.ref = "core-splashscreen" }
안드로이드 전용 라이브러리이기 때문에 androidMain에 의존성 추가
kotlin {
//...
sourceSets {
androidMain.dependencies {
//...
implementation(libs.core.splashscreen)
}
//...
}
}
이후 AndroidMain > res > values에 splash.xml 파일을 생성 후 아래와 같은 코드를 작성
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="Theme.App.Starting" parent="@android:style/Theme.Material.NoActionBar">
<!--배경 색상-->
<item name="windowSplashScreenBackground">#202020</item>
<!--아이콘 로고 선택-->
<item name="windowSplashScreenAnimatedIcon">@drawable/logo_squared</item>
<!--테마 선택 액션바가 없는 일반 Material 테마-->
<item name="postSplashScreenTheme">@android:style/Theme.Material.NoActionBar</item>
</style>
</resources>
이후 AndroidMain > kotlin > package > ActivityMain.kt에 아래와 같은 코드 추가
lass MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge()
//3초 후에 스플래시 스크린이 사라지도록 구현
var isChecking = true
lifecycleScope.launch {
delay(3000)
isChecking = false
}
//스플래시 스크린 호출하고 setKeepOnScreenCondition은 스플래스 스크린이 사라질지 안사라질지 여부를 판다.
installSplashScreen().apply {
// { } 에서 true면 유지, false면 스플래시 스크린이 사라짐
setKeepOnScreenCondition { isChecking }
}
//...
}
}
AndroidManifest.xml에 value폴더에 생성한 splash.xml 등록하기
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<!--theme 부분 변경 원래 기본 값이 있을 것임-->
<application
android:theme="@style/Theme.App.Starting">
<!--...-->
</application>
</manifest>
위 영상처럼 스플래시 화면이 정상적으로 나오지만 문제점으로 화면 위에 ActionBar가 나오는 것을 볼 수 있다.
분명히 postSplashScreenTheme에는 NoActionBar가 적용하도록 했는데 실제로는 ActionBar가 나오지 않는 것을 알 수 있다.
이 문제를 해결하려고 열심히 삽질한 끝에 간단하게 해결할 수 있었따...(무려 1시간 시간낭비를 ㅠㅠ)
해결방법은 MainActivity.kt 파일에 installSplashScreen함수를 최상단에 놔두는 것이다.
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
var isChecking = true
lifecycleScope.launch {
delay(3000)
isChecking = false
}
installSplashScreen().apply {
setKeepOnScreenCondition { isChecking }
}
//아래 두 코드보다 위에 작성해야 ActionBar가 안나옴 ㅅㅂ..
enableEdgeToEdge()
super.onCreate(savedInstanceState)
setContent {
App()
}
}
}
이렇게 적용하고 다시 실행해보니 이번엔 정상적으로 나오는 것을 볼 수 있다.
IOS는 따로 Xcode에서 등록을 해야 한다. 먼저 iosApp을 Open In으로 Finder로 열자

그러면 xcodeproj 확장자가 보일텐에 이를 Xcode로 열면 된다.

이후 Assets에 원하는 스플래시 아이콘을 등록 참고로 SVG는 안돼고 PNG 파일을 이용하면 된다.

왼쪽 폴더 중 iosApp을 클릭 후 New File from Template... 클릭

아래 보면 Launch Screen을 볼 수 있을 것이다 이를 생성(이름은 아무거나. 저는 SplashScreen이라 작성)

그러면 IOS 폰이 하나 보일 것이다 이를 관련된 View를 전부 지우면 아래와 같이 나올 것이다.

먼저 왼쪽에 View를 클릭 후 Background 색상을 찾자 만약 해당 부분이 안보이면 빨간색 부분을 찾아서 한 번 클릭해보자.

background 색상 클릭 후 > custom 클릭

2번 째 클릭 후 RGB Slider 선택 후 색상을 202020으로 변경 그러면 아래와 같이 색상이 변경된다.

이후 아래에 + 클릭 후 ImageView를 검색 후 사용(더블클릭이 아니라 끌어오면 됨)

그러면 ImageView가 보일텐데 여기서 Image를 찾아서 아까 assets에 저장한 이미지 클릭하면 된다.

가운데에 위치시키려면 아래 클릭 후 상하좌우를 전부 연결하면 된다.

이제 루트 iosApp 클릭 후 TARGET > General 쪽에 Launch Screen File에 만들었던 SplashScreen 등록

근데 저는 여기서 등록을 해도 SplashScreen이 정상적으로 실행되지 않고 심지어 탭으로 왔다가 돌아오면 저장되지 않고 초기화가 된다..
영상에서는 등록하고 바로 적용이 되는데 이 부분을 해결하려고 찾다가 Config에 아래 속성을 직접 넣어도 된다는 말을 듣고 적용했더니 해결이 되었다. 이미지처럼 동작이 잘되면 굳이 아래는 안봐도 된다.

Configuration > Config에서 아래 코드 추가
INFOPLIST_KEY_UILaunchStoryboardName = SplashScreen
SplashScreen은 내가 만든 파일 이름이므로 다른 이름일 수 있다.
