8월, 2023의 게시물 표시

iOS SwiftUI Keep screen on

이미지
운영 체제: macOS Ventura 13.5.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI iOS SwiftUI Keep screen on을 알아보겠습니다. 사용자의 입력이 없어도 화면이 켜진 상태로 유지되게 하려면 어떻게 해야 할까요? 한 번 알아봅시다. 아래는 공식 문서입니다. https://developer.apple.com/documentation/uikit/uiapplication/1623070-isidletimerdisabled 사용자의 입력이 없어도 화면이 켜진 채로 유지하려면 isIdelTimerDisabled를 사용합니다. 하지만, 이 기능은 사용자의 건전지 사용량에 영향을 주므로 꼭 필요할 때에만 사용해야 합니다. 그리고 필요 없을 때에는 다시 정상적으로 작동하도록 원상복구 시켜줘야 합니다. 끝. 카테고리: iOS, SwiftUI

Android When .asLiveData() collect flow and where does

이미지
사용 언어: Kotlin 1.9.0 사용 버전: Android Studio Giraffe 2022.3.1 안드로이드 When .asLiveData() collect flow and where does를 알아보겠습니다. 플로우(Flow)에는 .asLiveData()를 제공해 줍니다. 이것은 flow를 livedata로 형 변환해 주는 건데요. 그럼 언제 콜렉트(collect)를 해서 라이브데이터(livedata)로 변환시키는 걸까요? 또 어디서 하는 걸까요? 한 번 뜯어봅시다. 참고한 예제는 이 깃허브 프로젝트입니다. https://github.com/android/codelab-android-datastore/blob/387043a665d401ee6a95b843e67b102de0dd2242/app/src/main/java/com/codelab/android/datastore/ui/TasksViewModel.kt#L59 여기를 보면 TasksViewModel에서 asLiveData()를 호출하고 있습니다. collect가 숨겨져 있는데요. 아마도 asLiveData 안에 있지 않을까 예상해 봅니다. 그럼 asLiveData()를 한 번 뜯어봅시다. https://android.googlesource.com/platform/frameworks/support/+/refs/heads/androidx-main/lifecycle/lifecycle-livedata-ktx/src/main/java/androidx/lifecycle/FlowLiveData.kt#76 여기에 정의되어 있는데요. 보시면 콜백 함수로 liveData(context, timeoutInMs)의 block에 collect와 emit이 있었습니다. 그렇다면, liveData(context, ti

iOS SwiftUI Add drag gesture

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS SwiftUI Add drag gesture를 알아보겠습니다. 앱 개발을 하다가 사용자의 끄는 동작과 상호작용하는 요소가 필요할 때가 있습니다. 오늘은 사용자가 드래그하면 반응하도록 만들어보겠습니다. ​ ​ 자, 여기서 시작합니다. Gesture를 정의할 변수를 하나 만듭니다. 저는 myDrag로 만들었어요. DragGesture()를 만들고 onChanged와 onEnded를 추가해 줍니다. onChanged에는 실시간으로 끄는 동작을 추적하고 onEnded는 끄는 동작을 그만두고 손을 뗄 때 실행됩니다. 12 번째 줄처럼 myOffset이라는 변수를 만들어서 onChanged와 onEnded에서 값을 변경하도록 만듭니다. 16 번째와 19 번째 줄에 있는 dragValue는 startLocation(시작 위치), location(현재 위치), velocity(가속도)를 포함하고 있습니다. 여기서 현재 위치를 myOffset에 넣어주고 있습니다. 29 번째 줄에 offset을 설정해 줍니다. 30 번째 줄에 gesture를 설정해 줍니다. 사실 여기서 onEnded는 없어도 되지만 설명을 위해서 넣어봤습니다. 실행해 봅시다. 카테고리: iOS, SwiftUI

iOS Use CocoaPods

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI iOS Use CocoaPods를 알아보겠습니다. CocoaPods는 Object-C와 Swift의 의존성 관리를 위한 도구입니다. 아래는 공식 사이트입니다. https://cocoapods.org 설치는 다음과 같이 합니다. 터미널에 sudo gem install cocoapods를 입력합니다. 저는 이미 설치한 상태라서 보여드릴 수가 없네요. 자, 설치가 완료되었으면 CocoaPods를 사용해야 할 프로젝트 디렉터리로 갑니다. 터미널로 해당 위치로 간 뒤, pod init을 해줘서 빈 파일을 하나 만듭니다. 이렇게 Podfile이 생겼죠? 더블 클릭해서 열어줍니다. 요렇게 기본 양식이 적혀있습니다. platform :ios, '9.0'은 iOS 9.0부터 지원하겠다는 뜻입니다. use_frameworks! 밑에 사용할 프레임워크를 적어주면 됩니다. 저는 iOS 15.0을 지원할 거기 때문에 platform :ios, '15.0'을 적어줬습니다. Google Ads를 사용할 거기 때문에 pod 'Google-Mobile-Ads-SDK'로 적어줬습니다. 보통 해당 라이브러리 사이트에 가면 CocoaPods를 이용하는 방법이 적혀있습니다. 아래는 구글 AdMob 사이트 예시입니다. 그다음에 pod install을 해줍니다. 원래는 그냥 install만 하면 되는데 여기서는 --repo-update를 해달라고 하네요.

Android Migrate splash screen to above Android 12

이미지
사용 언어: Kotlin 1.9.0 사용 버전: Android Studio Giraffe 2022.3.1 안드로이드 Migrate splash screen to above Android 12를 알아보겠습니다. Android 12(API 32) 이상에서는 자동으로 시작 화면(Splash)을 보여줍니다. 그래서 하위 버전에서 따로 Splash를 만들었다면, 이중으로 화면이 보이게 되는 문제가 발생합니다. 그래서, Android 12 이상에서도 중복되지 않고 매끄럽게 작동하도록 만들어 보겠습니다. 공식 문서입니다. https://developer.android.com/develop/ui/views/launch/splash-screen/migrate 아직 변경하기 전이라서 두 번 로딩 화면이 불러와집니다. 느껴지시나요? 아직 변경하기 전이라서 두 번 로딩 화면이 불러와집니다. 느껴지시나요?앱 용 build.gradle로 갑니다. compileSdk는 31 보다 위 버전으로 설정합니다. dependencies에는 implementation "androidx.core:core-splashscreen:1.0.1"를 적어줍니다. Sync now를 합니다. 다음으로는 이걸 해줍니다. style이나 themes 파일로 가서 위의 내용대로 만들어 줍니다.  windowSplashScreenBackground는 배경 색상. postSplashScreenTheme은 이 화면 다음에 나타나는 기본 스타일을 지정해 줍니다. windowSplashScreenAnimatedIcon에는 Vector 이미지만 넣습

Android Fix deprecated Gradle plugin API

이미지
사용 언어: Kotlin 1.9 사용 버전: Android Studio Giraffe 2022.3.1 안드로이드 Fix deprecated Gradle plugin API를 알아보겠습니다. Gradle plugin이 업데이트되면서 많이 달라지는 부분이 있는데요. 사실 평소에는 잘 건드리지 않습니다만, 현재는 deprecated 된 부분이 생겨서 수정해 줘야 하네요. Android Gradle plugin API를 볼 수 있는 공식 사이트입니다. https://developer.android.com/reference/tools/gradle-api 저는 현재 최신 버전인 8.1.0을 사용 중입니다. 8.1.0을 눌러 문서로 갑니다. 현재 제가 고쳐야 하는 부분은 총 3군데입니다. compileSdkVersion buildToolsVersion noCompress 자 문서를 보면서 고쳐봅시다. com.android.build.api.dsl -> Interfaces -> ComoonExtension으로 갑니다. https://developer.android.com/reference/tools/gradle-api/8.1/com/android/build/api/dsl/CommonExtension#summary 우리가 찾던 게 보입니다. compileSdk를 써라고 하네요. buildToolsVersion을 봅시다.

Android Migrate from kapt to KSP

이미지
사용 언어: Kotlin 1.9.0 사용 버전: Android Studio Giraffe 2022.3.1 안드로이드 Migrate from kapt to KSP를 알아보겠습니다. kapt는 Java에서 지원하는 어노테이션을 코틀린에서도 사용할 수 있게 해주는 플러그인입니다. 이제는 새로운 기능은 추가되지 않고, 기존에 있는 것만 유지 보수된다고 합니다. 새롭게 지원되는 것이 KSP입니다. Kotlin을 위해 만들어진 플러그인으로 JVM에 묶이지 않으며 빌드 속도를 빠르게 해줍니다. kapt에서 KSP로 변경해 봅시다. 공식 문서는 다음과 같습니다. https://developer.android.com/build/migrate-to-ksp#kts room database인데, kapt를 사용하던 부분에 이렇게 불이 들어옵니다. 상세 내역을 보면 다음과 같이 적혀있습니다. This library supports using KSP instead of kapt, which greatly improves performance. 프로젝트 용 build.gradle로 갑니다. plugins에 id 'com.google.devtools.ksp' version '1.9.0-1.0.13' apply false 추가해 줍니다. plugins는 buildscript와 allprojects 사이에 넣어줍니다. 가장 최근의 버전을 써줬습니다. 앱 용 build.gradle로 갑니다. plugins에 id 'com.google.devtools.ksp' 추가해 줍니다. kapt를 KSP로 변경해 줍니다.