7월, 2023의 게시물 표시

iOS Notice when my app's been background

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS Notice when my app's been background를 알아보겠습니다. 앱이 백그라운드로 들어가는 것을 아는 방법은 여러가지 있습니다. ​ 1. AppDelegate 사용. https://shwoghk14.blogspot.com/2023/01/ios-make-appdelegate-in-swiftui.html 2. onReceive NotificationCenter를 사용. https://shwoghk14.blogspot.com/2023/01/ios-how-to-notice-app-is-will-enter.html 3. scenePhase를 사용. 그중 오늘은 scenePhase를 사용하는 방법을 알아봅시다. ​ 12 번째 줄처럼 @Environment를 사용하여 scenePhase를 정의합니다. 16 번째 줄처럼 onChange를 적어줍니다. 그리고 of에는 scenePhase를 적어줍니다. 18 번째 줄처럼 switch를 사용합니다. background이면, background 상태입니다. inactive이면 inactive 상태입니다. active이면 active 상태입니다. 끝. 카테고리: iOS

Algorithm BFS(Breadth-first search)

이미지
알고리듬 BFS(Breadth-first search)를 알아보겠습니다. BFS는 너비 우선 탐색인데요. 2진 트리가 있을 때 너비를 우선 탐색하는 것을 말합니다. BFS는 Queue 자료구조를 이용하여 쉽게 탐색할 수 있습니다. ​ 아래와 같은 트리가 있다고 봅시다. 너비 우선 탐색은 내려가기 전에 너비를 한 번 쫙 훑어보는 것을 말합니다. 탐색 순서는 이렇게 됩니다. 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 뭐 사람에 따라서는 이렇게 하기도 하겠죠. 1 -> 3 -> 2 -> 6 -> 5 -> 4 -> 7 어떤 식으로 하든 같은 계층에 있는 노드를 다 방문하기 전에는 아래로 내려가지 않는다는 점 꼭 기억해 주세요. 코드로 한 번 보겠습니다. Python에서 deque을 사용합니다. queue는 스레드를 신경 쓰고, deque는 스레드를 신경 쓰지 않기 때문에 속도적인 측면만 필요하다면 queue보다는 deque을 사용하는 게 좋습니다. 12 번째 줄처럼 탐색에 사용할 deque(덱)를 하나 만듭니다. 13 번째 줄처럼 root를 집어 넣습니다. 15 번째 줄에서 덱이 비어있지 않다면 계속 탐색을 하도록 합니다. 16 번째 줄에서 현재 덱에 들어있는 크기를 구하고, 18 번째 줄처럼 그 크기만큼 반복합니다. 19 번째 줄처럼 덱에 들어있는 노드를 꺼내어 다음에 탐색할 왼쪽, 오른쪽 노드들을 덱에 넣습니다. 끝. 카테고리: Algorithm

iOS Pop to the root view

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS Pop to the root view를 알아보겠습니다. ​ 앱을 만들 때, 처음 화면(Root view)로 돌아가야 할 때가 있습니다. 이럴 때 어떻게 해야 하는지 알아봅시다. pop이라는 용어를 쓰는 이유는 Navigation 할 때, 해당 뷰가 Stack에 저장되기 때문입니다. Stack에서는 저장할 때 Push, 나올 때 Pop을 씁니다. 그러니까 여기서는 Root view가 나올 때까지 꺼낸다는 뜻입니다. ​ ​ 일단 3개의 파일을 만듭니다. 각 내용은 다음과 같습니다. ContentView NavigationLink(destination:, isActive:)를 사용합니다. isActive의 해당 값이 true 면 화면 전환이 일어납니다. Number2 @Binding으로 isActive 인자 값을 넘겨받습니다. Number3 @Binding으로 isActive 인자 값을 넘겨받고, 해당 값을 false로 만들어주면 화면 전환이 취소가 됩니다. 실행해 봅시다. 위의 코드로 iOS16에 그냥 사용해도 잘 작동됩니다. 다만, 새롭게 추가된 NavigationStack 등이 사용되면 작동하지 않습니다. ​ iOS 16 이상에서는 NavigationStack 등 API의 변화가 있기 때문에 다른 방식으로 접근해야 합니다. NavigationStack으로 변경해 주고, path를 사용합니다. navigationDestination을 사용합니다. Number2 Num

iOS Using the magnetometer sensor

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS Using the magnetometer sensor를 알아보겠습니다. iOS에서 자기계(magnetometer) 센서 또는 자기(magnetic) 센서를 사용하는 방법을 알아봅시다. ​ ​ 휴대폰에 있는 센서를 사용하기 위해서는 CoreMotion을 사용합니다. https://developer.apple.com/documentation/coremotion/getting_processed_device-motion_data 9 번째 줄처럼 CoreMotion을 import 합니다. 13 번째 줄처럼 motionManager에 CMMotionManager를 정의합니다. 이 motionManager가 모든 센서를 관장합니다. 함수를 하나 만듭니다. 저는 startMagnetometer라고 적었습니다. 20 번째 줄처럼 isMagnetometerAvailable을 사용하여 자기 센서가 사용 가능한지 확인합니다. 21 번째 줄처럼 magnetometerUpdateInterval을 사용하여 몇 번 읽어들일지 설정합니다. 현재는 1 초에 50 번 읽는 설정입니다. 22 번째 줄처럼 startMagnetometerUpdates를 사용해서 센서 값 읽기를 실행합니다. to에는 OperationQueue.main을 적어줍니다. 14 번째 줄처럼 자기 값을 받을 변수를 하나 만듭니다. 25 번째 줄처럼 nil 인지 확인하고, 26 번째 줄에서 magneticField 값을 대입합니다. 출력을 해봅시다. body 부분을 다음과 같이 수정해

Mac install brew

이미지
운영 체제: macOS Ventura 13.4.1 ​ 맥 install brew를 알아보겠습니다. brew는 맥 앱스토어에서 제공하는 프로그램 이외의 것들을 설치할 때 사용하는 프로그램입니다. Linux에는 apt-install, Python에는 pip install 등 해당 패키지를 관리할 수 있는 프로그램들이 존재하는데요. brew는 macOS를 위한 패키지 관리 프로그램입니다. ​ 맥에 사용할 프로그램들을 설치하더라도 앱스토어를 통한 정식 경로로 설치하는 것이 아니므로 조심해서 사용하는 게 좋겠죠. ​ https://brew.sh brew 사이트입니다. ​ 설치를 해봅시다. ​ 해당 페이지에서 오른쪽 복사하기 버튼을 눌러서 복사를 해줍니다. /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 그 뒤에 터미널을 실행합니다. 복사한 것을 붙여 넣어줍니다. 엔터를 치면 비밀번호를 입력하라고 나옵니다. 비밀번호를 입력하고 엔터를 치면 다음과 같이 설치가 완료됩니다. 이런, Xcode Command Line Tools는 필요 없는데 설치되고 있군요. 설치가 다 되었습니다. 밑에 보면 next step이 있습니다. 여기서 환경 변수를 설정해 줘야지 brew를 터미널 어디서나 사용할 수 있습니다. 복사한 것을 터미널에 입력해 줍니다. brew를 치니 잘 불러와지네요. ffmpeg가 필요해서 설치해 보겠습니다. brew update를 먼저 해줍니다. brew install [패키지명]을 쳐줍니다. 저는 brew i

Android Fix gradle dependency duplicate error

이미지
사용 언어: Kotlin 1.9.0 사용 버전: Android Studio Flamingo 2022.2.1 Patch 1 안드로이드 Fix gradle dependency duplicate error를 알아보겠습니다. 빌드를 하던 중 이러한 오류가 발생하였습니다. Duplicate class com.google.android.play.core.appupdate.AppUpdateInfo found in modules jetified-app-update-2.1.0-runtime (com.google.android.play:app-update:2.1.0) and jetified-core-1.10.3-runtime (com.google.android.play:core:1.10.3) 저는 com.google.android.play:core 라이브러리를 삭제한 상태인데요. 이러한 오류가 발생하니 당황스럽습니다. 이러한 경우는 제가 해당 라이브러리를 사용하지 않더라도, 의존성(Dependency)이란 게 있어서 어떠한 라이브러리에서 play:core을 사용하고 있는 상태이기 때문에 발생합니다. 그러면, 해당 라이브러리를 확인해야겠죠? 우측에 있는 Gradle로 갑니다. 우측에 보이지 않는다면, 아래의 경로로 찾아갑니다. View - Tool Windows - Gradle Execute Gradle Task를 누릅니다. 여기에 gradle app:dependencies를 입력합니다. 그러면 아래에 이런 식으로 의존성이 보입니다. Ctrl + F로 검색을 합니다. 자, 중복 오류가 나온 라이브러리는 androidx.navigation:navigation-dynamic-

Android Migrate Google Play Core library

이미지
사용 언어: Kotlin 1.8.10 사용 버전: Android Studio Flamingo 2022.2.1 Patch 1 안드로이드 Migrate Google Play Core library를 알아보겠습니다. Google Play Core library가 세분화가 되었습니다. 이번에 Navigation 쪽 라이브러리를 업데이트하다가 Duplicate 오류가 발생하여 알아보던 중, Google Play Core library 쪽에 문제가 있는 것으로 판단되어 확인해 보니 이렇게 문서가 작성되어 있네요. https://developer.android.com/guide/playcore 자, 그럼 play core 라이브러리를 변경해 봅시다. 저에게 필요한 라이브러리는 Play Feature Delivery Library와 Play In-App Update Library입니다. 기존에 있던 com.google.anddroid.play:core:1.10.3과 com.google.android.play:core-ktx:1.8.1을 지웁니다. 그리고 저에게 필요한 Play feature Delivery Library com.google.android.play:feature-delivery:2.1.0 com.google.android.play:feature-delivery-ktx:2.1.0을 적어줍니다. 그리고 또 필요한 Play In-App Update Library도 추가합니다. com.google.android.play:app-update:2.1.0 com.google.android.play:app-update-ktx:2.1.0

Android Unknown -Xjvm-default mode error

이미지
사용 언어: Kotlin 1.9.0 사용 버전: Android Studio Flamingo 2022.2.1 Patch 1 ​ 안드로이드 Unknown -Xjvm-default mode: enable, supported modes: [disable, all-compatibility, all]를 알아보겠습니다. ​ Gradle을 업데이트하고, 각종 버전을 올린 후 빌드를 하다 보면 종종 오류를 만나곤 합니다. 이번에 만난 오류는 이것인데요. Unknown -Xjvm-default mode: enable, supported modes: [disable, all-compatibility, all] 이 오류는 이렇게 고치면 됩니다. app 용 gradle로 갑니다. kotlinOptions에 있는 freecomilerArgs 부분을 수정해야 합니다. 위에 오류에 나와있는 disable, all-compatibility, all 중에서 선택하시면 됩니다. 해당 내용은 https://kotlinlang.org/docs/whatsnew1620.html#compatibility-changes-in-the-xjvm-default-modes https://kotlinlang.org/docs/whatsnew18.html#kotlin-jvm 여기에 나와 있습니다. 끝. 카테고리: Android

iOS Using the proximity sensor

이미지
운영 체제: macOS Ventura 13.4.1 사용 버전: Xcode 14.3.1, Swift, SwiftUI ​ iOS Using the proximity sensor를 알아보겠습니다. ​ iOS에는 근접 센서(Proximity sensor)가 존재합니다. 이 센서의 동작을 읽어들일 수 있습니다. 즉, 가까이 왔는지 안 왔는지 Bool 값으로 확인이 가능합니다. ​ 먼저, 근접 센서를 사용할 것이라고 정의합니다. init에 하셔도 되고, onAppear에 하셔도 됩니다. 근접센서를 사용하기 전에 정의를 해야겠죠? 20 번째 줄처럼 UIDevice.current.isProximityMonitoringEnabled에 true를 넣어줍니다. .onReceive로 근접센서 이벤트를 받습니다. NotificationCenter.default.publisher()를 적어주시고, for에는 UIDevice.proximityStateDidChangeNotification을 적어줍니다. 23 번째 줄에는 if 문을 통해서 UIDevice.current.proximityState를 확인합니다. 이 값이 true 면 가까이 근접한 것이고, false 면 멀리 있다는 뜻입니다. 이제, 근접 센서가 필요 없는 순간이 오면, 해제해 줍니다. 30 번째 줄처럼 UIDevcie.current.isProximityMonitoringEnabled를 false로 만들어줍니다. 끝. 카테고리: iOS