Minecraft screenshot with moon setting in y=-59
개발
프론트엔드
Kotlin Multiplatform Mobile + Jetpack Compose + iOS = ?
2023-02-22, 14:03 | HoonKun
Kotlin Multiplatform Mobile + Jetpack Compose + iOS = ?

본 게시글은 23년 2월 22일, 1.4.0-alpha01-dev938 버전의 컴포즈를 사용한 후기입니다.
부디 여러분이 이 게시글을 보는 시점에는 안정적인 컴포즈가 배포되어 iOS에서도 무리없이 개발이 되었으면 좋겠네요.

도...망쳐... 오지마... 어서 도망쳐!! 도망치라고!!!

저번에 데스크탑을 타겟으로한 Jetpack Compose 토이 프로젝트를 진행한 적이 있었다.
여기 에 기술되어 있는데, 그 때는 개발에 큰 문제는 없었다.

그리하여, 아이폰도 마련했겠다 iOS를 개발해보기 위해 프레임워크를 뒤적이던 중 Jetpack Compose 가 아직 공식 지원은 아니지만 iOS에서도 돌릴 수는 있다고 하길래 바로 시도해봤다.
정확히는 'iOS는 아직 실험적이며 개발 중에 있습니다. 모든 리스크를 감수하고 사용하십시오.(원문: The other targets (iOS, Compose for Web Canvas) are experimental and under development. Use them at your own risk.)'라고 기술되어있었다.

근데 사실 이 글귀는 이미 엉망진창으로 당하고 난 뒤에 뭐 이래?? 하고 문서를 봤을 때 발견한 글귀라서... 별로 의미는 없었다.

결론부터 말하자면, iOS는 아직 Compose 로 개발하기 어려울 것 같다.

지금까지 iOS에서 겪은 런타임 관련 이유는 다음과 같다:

  • 한국어 입력이 이상하다. 입력창에 '안녕하세요'를 입력하면 '아ㄴ녀ㅇ하세요' 가 입력된다. 받침이 입력이 안된다...
    • 정확히는 자모가 2개까지만 조합되고 그 이상은 조합되지 않는다. 예를들면 '왜' 도 '오ㅐ'로 입력된다.
  • AnimatedVisibility 에 사용되는 상태를 변경할 때 간헐적으로 앱이 죽는다. 컨텐츠의 숨김/보이기 애니메이션을 사용한다면 문제가 있다.

한국어 입력의 경우 onValueChange 핸들러의 호출도 이상하고, CoreTextFieldLocalTextInputService에 내부적으로 할당(provide)되는 인스턴스의 PlatformTextInputService 에 뭔가 문제가 있는 것으로 보이나 실제 소스가 안찾아져서 자체 수정은 포기했다.
사실 이거 수정하려고 한글 오토마타라던가 자모 합치기 이런 라이브러리 겁나 많이 뒤졌다 (...)

기타 개발하면서 든 생각은 다음과 같다:

  • 빌드 스크립트가 너무 급진적으로 변경된다. 약 저번 프로젝트 이후 약 반년이 지났는데, 빌드스크립트 생긴게 대격변이 일어난 것 같았다.
  • 기능들도 너무 급진적으로 변경된다. 스택오버플로우를 돌아다녀보면 눈치챌 수 있을 텐데, 클래스 이름들이 바뀌거나 하는 경우가 잦다.
  • 그러면서 기존에 되던것들이 컴포즈에서는 안되는 경우가 아직 있다. 대표적으로는 LazyColumn 의 아이템 insertion/deletion transition.

인터넷에 보면 iOS에서 Compose 셋업하기 이런 게시글 엄청 많이 보이는데, 그거에 혹해서 시도해보기에는 아직 너무 이르다.

물론 공식에서도 'iOS는 아직 개발중이다' 라고 했으니 더 할 말은 없지만, 언제 지원해줄지도 알 수 없는 상황이기 때문에 사실상 지금 iOS를 Compose 를 써서 개발하기에는 무리가 있을 것 같다.

그렇지만, 분명 Jetpack Compose 는 괜찮은 라이브러리이다.

  • 완성되어있는 기능들에 대해서는 굉장히 강력하다. 이걸 느낀게:
    • TextFieldvisualTransform 이라는 기능이 있는데, 이걸 쓰면 실제 입력된 값과 보이는 값에 차이를 둘 수 있으며 글자단위로 AnnotatedString 을 사용해 스타일링이 가능하다.
    • Animation 지원이 생각보다 쓸만하다. AnimatedVisibility 부터 Crossfade나, animate*AsState 같은 매우 강력한 API들이 제공된다.
  • 상태기반이며 Kotlin 이다.
    • 기존 안드로이드 개발을 생각하면 이건 혁명이다. 물론 iOS는 이미 스위프트라는 상태 기반의 UI로직을 사용하고 있긴 했지만.

그래서 비록 지금은 너무 많은걸 당해서 지쳤다보니 아주 약간아니 사실 아주 많이 컴포즈에 실망하긴 했지만 언젠가 꼭 컴포즈가 iOS를 안정적으로 지원해주길 바란다.

키위새의 아무말 저장소
  • 개발
  • 마인크래프트
  • 생명과학II
  • 아무말
Blog Logo