일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 클로저의 캡슐화
- AnyObject
- 러닝기록앱
- Startign Assignments
- xcode로 날씨앱 만들기
- CLLocationManagerDelegate
- RunningTimer
- Protocol
- 서체관리자
- swift
- dispatchsource
- 영문 개인정보처리방침
- font book
- WeatherManager
- MKMapViewDelegate
- 한국어 개인정보처리방침
- MKMapItem
- addannotation
- 러닝타이머
- App Store Connect
- UIAlertAction
- UICollectionViewFlowLayout
- weak var
- Timer
- Required Reason API
- weatherKit
- CoreLocation
- 단일 책임원칙
- Xcode
- SwiftUI Boolean 값
- Today
- Total
목록Whale life (217)
VesselWheel
https://brunch.co.kr/@jinhoneybee/3 책 '인스파이어드'로 보는 PM/PO의 역할PM/PO는 뭐하는 사람이에요? | PM으로 처음 일을 시작하면서는 하루하루 주어진 일을 해내기에 바빴다. 5개월 차에 접어들며 이제 겨우 조금씩 데일리 업무들이 익숙해지기 시작하며 나라는 존재brunch.co.kr 프로덕트/프로젝트 매니저가 한번 읽어볼만한 책 2024. 09. 01. Starting the job of Project Managerhttps://cantabilano.notion.site/8c2ecd2b51e94484b36d0a7bc0e40f51?v=4e3245e3d33a439dae925c30c18a8a7f&pvs=4 Today I learned in Divii | NotionMad..
https://velog.io/@hayeon/%EC%86%8C%EC%BC%93%ED%86%B5%EC%8B%A0 소켓통신1. 소켓통신 네트워크를 통해 서버-클라이언트 양쪽에 링크를 생성하고 그 링크를 통해 데이터를 주고 받는 것 이때 서버에 임의의 포트번호를 설정한 상태에서 클라이언트에서 해당 포트로 접velog.io
Swift의 async/await 패턴을 사용하여 비동기 처리 부분을 변경하려면 기존의 performRequestForecast 메서드와 getForecastWeather 메서드를 수정해야 합니다. 다음은 async/await를 사용하여 코드를 수정한 예시먼저, performRequestForecast 함수를 async/await를 사용하도록 변경 private func performRequestForecast(with url: URL?) async throws -> WeatherData { guard let url = url else { throw NetworkError.badUrl } let (data, _) = try await URLSession.shared.data(..
0. xcode intruments의 leaks를 활용한 디버깅 하기 더보기 startRequest:traits:auditToken:useBackgroundURL:requestPriority:callbackQueue:finished:networkActivity:error:]_block_invoke_2+0xc4" 디버깅 문구를 생자로 찾아내기엔 스택오버플로우나, 공식문서에서는 찾기 어려웠다. 그래서 Chat GPT의 도움을 받았다. 이 문구는 프로그래밍 중에 발생한 오류나 버그를 찾아내기 위한 디버깅 과정에서 볼 수 있는 로그의 일부입니다. 구체적으로 설명하자면, 이 로그는 특정 함수나 메소드의 호출 스택 중 하나를 나타내며, 여기서는 어떤 작업을 시작하기 위한 요청(startRequest)이 이루어지는 ..
https://developer.apple.com/videos/play/wwdc2023/10184 Meet ActivityKit - WWDC23 - Videos - Apple Developer Live Activities are a glanceable way for someone to keep track of the progress of a task within your app. We'll teach you how you can... developer.apple.com https://developer.apple.com/documentation/widgetkit/ WidgetKit | Apple Developer Documentation Extend the reach of your app by creati..
1. 데이터 원본(Data Source) 설정 UITableViewDataSource 프로토콜은 테이블 뷰에 데이터를 제공하는 메서드를 정의합니다. 주요 메서드는 다음과 같습니다: numberOfSectionsInTableView: 테이블 뷰의 섹션 수를 반환합니다. 섹션이 하나라면 1을 반환하면 됩니다. tableView(_:numberOfRowsInSection:): 각 섹션에 속한 행의 수를 반환합니다. tableView(_:cellForRowAt:): 각 행에 대한 셀 객체를 반환합니다. 여기서 셀의 내용을 구성합니다. 2. 델리게이트(Delegate) 설정 UITableViewDelegate 프로토콜은 테이블 뷰의 시각적인 부분과 사용자 인터랙션을 관리합니다. 주요 메서드는 다음과 같습니다: t..
https://jochen-holzer.medium.com/embrace-the-evolution-preparing-your-ios-app-for-the-required-reason-api-38f2d12bbce5 Embrace the Evolution: Preparing Your iOS App for the “Required Reason API” Learn how to prepare your iOS app for the required reason API. Step-by-Step guide that helps to prepare the privacy manifest of your app in Xcode. jochen-holzer.medium.com https://developer.apple.com/doc..
Review Environment Submission ID: 6702533a-06c9-4ddf-b8a6-536391bbbeb8 Review date: March 21, 2024 Version reviewed: 1.0 Guideline 2.1 - Performance - App Completeness Your app or its metadata does not appear to include complete and final content. Specifically, your app includes placeholder content under Event. App Store users expect the apps they download to be ready for public use. Apps on the..
https://velog.io/@anfgbwl/Swift-뷰View와-레이어Layer의-개념과-차이 [Swift] 뷰(View)와 레이어(Layer)의 개념과 차이 iOS에서 뷰(View)와 레이어(Layer)는 그래픽 요소를 표시하고 관리하는 데 사용되는 중요한 구성 요소이다.뷰(View)는 사용자 인터페이스의 기본 구성 요소이다. 화면에 표시되는 버튼, 레이블, 이미 velog.io
기존 타입에 기능을 추가하는 수평 확장하는 개념으로 확장을 이용하여 structure, class, enum, protocol 타입에 새로운 기능을 추가할 수 있습니다. 외부에서 가져온 타입에 내가 원하는 기능을 추가하고자 할 때 확장을 사용할 수 있습니다. 확장으로 구현 가능한 것은 다음과 같습니다. Extension으로 구현 가능한 것들: 새로운 계산된 속성(Computed Property) 추가 새로운 인스턴스/타입 메서드 추가 새로운 초기화(Initializer) 추가 프로토콜 채택(Protocol Conformance) 서브스크립트 추가(Subscripting) 중첩 타입(Nested Type) 추가 Extension으로 구현 불가능한 것들: 저장 프로퍼티(Stored Property) 추가: ..
앱 배포 단계에서 앱에서 사용되는 개인정보처리방침에 대해 제출해야한다. 앱 개발에만 몰두하다보니, 앱이 사용되는 서비스 제공 단계에서 개인의 개인정보를 활용하게 된다. 러닝앱에서는 가입을 위한 이메일과 사용자 위치정보이다. 개인정보법에 의해 다루어지는 것이기 때문에, 회사 단계에서는 법무팀의 성격의 부서가 담당하는 부분일 것이다. 이미 많은 개발자들이 힘들거나 귀찮은 부분인건지 자동생성 플랫폼이 여러가지가 있었다. 개인정보처리방침을 만들기 위해서는 언어적으로 영문과 한국어가 있다. 우선 영문, https://app-privacy-policy-generator.firebaseapp.com/ App Privacy Policy Generator What is a privacy policy? A privacy ..
https://developer.apple.com/fonts/ Fonts - Apple Developer Get the details, frameworks, and tools you need to use system fonts for Apple platforms in your apps. developer.apple.com apple에서 지원하는다양한 폰트가 맥북의 서체관리자(fontbook)에 내장되어 있다. xcode 내에서 맥북에 내장된 폰트를 사용하기 위해서는 lazy var timerCounterView: UILabel = { let label = UILabel() label.font = UIFont(name: "Arial Rounded MT Bold", size: 200) label.textCo..
옵셔널은 값이 없을 수 있는 상황에서 사용됩니다. ?를 활용해서 옵셔널로 래핑하고 !로 언래핑합니다. 옵셔널 값이 빈값인지 검사하기 위해서 옵셔널 바인딩을 사용하며 if let, if var, guard let, guard var를 사용해서 옵셔널값을 추출해 새로운 변수에 바인딩합니다. 옵셔널 값이 nil 아닌 경우가 확실할 경우, 옵셔널값 뒤에 !를 써서 강제로 옵셔널을 추출합니다. 강제언래핑 대안으로 옵셔널 체이닝을 활용하여 옵셔널인 프로퍼티, 매서드, 그리고 서브스크립트를 조회하고 호출할 수 있습니다. 강제언래핑과 옵셔널 체이닝의 차이점은 옵셔널값이 nil일 때, 옵셔널 체이닝은 실패하는 반면, 강제 언래핑은 런타입 에러가 발생합니다. https://bbiguduk.gitbook.io/swift/l..
문제점 사용자가 움직이지 않거나, 실내일 때에는 거리값이 증가하지 않고, 따라서 페이스 또한 증가하지 않아 Nil인 상태이다. 이로 인해, 코어데이터에서 러닝기록을 호출하는 프로필뷰를 탭했을 때, 오류로 인해 기기에서는 앱이 멈추거나 자동종료 되는 문제가 발생했다. 원인 - runningRecord.pace 값은 NaN 상태로 값이 없다. 상기 상황에서 정지버튼을 누르면 runningRecord.pace는 NaN 상태로 코어데이터에도 저장된다. - runningRecord.pace 값이 NaN으로 null 상태일 때, Int값으로 형변환을 할 수 없음. 해결방법 우선 xcode 무한값 유한값을 검색했다. 한글로 검색하니 상관있는 검색결과가 나오지 않는다. 영어로 무한값 infinite, 유한값 finit..
클래스란? 프로그램 코드의 구성요소가 되는 범용의 유연한 구조로, 구조체와 달리 참조타입으로 같은 인스턴스를 사용하며, 값을 저장하는 프로퍼티와 기능을 제공하는 메서드로 구성되어 있다. 클래스의 프로퍼티에 기본값이 없는 경우, 초기화를 해주어야한다. 1. 클래스 정의 class VideoMode { var resolution = Resolution() var interlaced = false var frameRate = 0.0 var name: String? } 2. 인스턴스 생성 let someVideoMode = VideoMode() 3. 프로퍼티에 접근하기 위해서는 점 구문을 사용한다. someVideoMode.resolution.width = 1280 4. 즉, 동일한 인스턴스를 활용하거나 동일한..
문제점 오늘도 트러블 메이커, query 호출제한과 완료되지 않은 쓰레드의 표시 접근 제한 버튼을 통해서, query와 category로 annotation과 업체 정보를 호출하고자 했다. 더보기 func getAnnotations(forQuery query: String, category: String) { // 모든 어노테이션 제거 let allAnnotations = self.mapView.annotations self.mapView.removeAnnotations(allAnnotations) guard let currentLocation = self.mapView.userLocation.location else { print("Failed to get user location") return } ..
현재 문제점 -> 러닝타이머 거리값이 pause 버튼을 누렀다가, 다시 재개를 누르면 계속 기록되지 않고 멈춤 1. 버튼의 target 매소드인 restartRunning()에는 시간값을 책임하는 restart() 매소드가 있다. 상기 코드에서 보면 self.runningTimer.restart() self.dismiss(animated: true) { self.delegate?.didDismissPauseRunningHalfModalViewController() } runningTimer 클래스를 델리게이트 패턴 선언하고 PauseRunningHalfModalViewController에서 객체화하고 나서, restart()매소드를 호출하고 있다. class PauseRunningHalfModalView..
https://skytitan.tistory.com/551 [Swift] 왜 struct에선 mutating을 사용해야하는가? How is struct(immutability) related to thread safety? Posted in r/swift by u/vingrish • 1 point and 14 comments www.reddit.com Swift and mutating struct There is something that I don't entirely understand when it comes to mutating value types in Swift. A skytitan.tistory.com https://youtu.be/8T5vQnMspko If a struct has a vari..
구조체 (Structures)는 프로그램 코드의 구성 요소가 되는 범용의 유연한 구조입니다. 상수, 변수, 그리고 함수를 정의하는 것과 같은 구문을 사용하여 구조체와 클래스에 프로퍼티와 메서드를 기능적으로 추가할 수 있습니다. 구조체는프로퍼티에 값을 저장하거나 메서드를 통해 기능을 제공하고 이걸 하나로 캡슐화할 수 있는 사용자 정의 타입입니다. 생성자(initializer)를 정의하지 않으면 구조체가 자동으로 생성자(Memberwise Initializer.)를 제공합니다. 여기서 값타입 이란? 값 타입은 변수나 상수에 할당될 때 값의 복사본이 생성되는 타입입니다. 주로 구조체(Structures), 열거형(Enumerations), 기본 데이터 타입(Int, Double, Bool, 등)이 값 타입에 ..
앞선 게시물에 이어서, weatherKit을 활용한 날씨정보를 러닝맵뷰의 좌상단에 노출하고자 한다. 1. weatherKit을 활용한 WeatherViewModel // // WeatherViewModel.swift // Run-It // // Created by Jason Yang on 3/12/24. // import Foundation import WeatherKit import CoreLocation import Combine class WeatherViewModel: ObservableObject { // UI Properties @Published var weathersymbolName: String = "" @Published var currentTemperature: Double = 0 @..
WWDC22에서 소개된 weatherKit을 활용해서 지도앱 위에 날씨정보를 사용자에게 노출하고자 한다. 러닝을 하기에 앞서, 가장 중요한 것이 날씨이다. 실내에서의 러닝은 트레드밀에서 하기 때문에, 날씨의 영향을 받지 않지만, 러너들에게 날씨는 러닝 복장, 페이스 그리고 러닝목표와 장소까지 날씨로 비롯된 고려해야할 요소가 크게 달라진다. 그렇기 때문에, 러닝맵에서 러닝기록에 이어서, 두번째로 중요한 것이 날씨정보이다. https://developer.apple.com/videos/play/wwdc2022/10003/?time=268 Meet WeatherKit - WWDC22 - Videos - Apple Developer WeatherKit offers valuable weather data for ..
https://teamsparta.notion.site/iOS-bfd974b3733a4c01911ef33fc486d600 iOS 배포 가이드라인 | Notion 배포 가이드라인 teamsparta.notion.site -> 스파르타코딩클럽 학원 측에서 안내한 배포가이드 https://developer.apple.com/kr/help/account/get-started/about-your-developer-account 개발자 계정 정보 - 시작하기 - 계정 - 도움말 - Apple Developer 시작하기 개발자 계정 정보 Apple Developer 웹 사이트에서는 멋진 Apple 플랫폼용 앱을 만드는 데 필요한 도구와 정보를 제공합니다. Apple 플랫폼에서 개발이 처음인 경우 무료로 시작할 수 있..
Mapkit을 사용하기 위해서는 첫번째로 CLLocationManager과 MKMapView의 객체를 정의해야한다. 더보기 lazy var locationManager: CLLocationManager = { let manager = CLLocationManager() manager.desiredAccuracy = kCLLocationAccuracyBest manager.startUpdatingLocation() // startUpdate를 해야 didUpdateLocation 메서드가 호출됨. manager.delegate = self manager.pausesLocationUpdatesAutomatically = false manager.allowsBackgroundLocationUpdates = t..
MapKit에서 경로를 구현하기 위해서는 첫번째로 CLLocationManagerDelegate를 활용하여 위치서비스 권한요청을 실시한다. -> 사용자의 현재 위치나 사용자의 위치를 활용한 기능을 구현할 때 필요한 프로토콜이다. 러닝기록앱으로서 사용자의 위치를 추적하고, 경로를 이동할 때 사용될 예정이다. 싱글톤 패턴으로 CLLocationManagerDelegate을 통해 정의한 위치서비스 권한 요청, 위치업데이트 매소드를 호출한다. 위치 권한 관련된 매소드가 locationManagerDidChangeAuthorization이 있다. locationManagerDidChangeAuthorization 매소드는 locationManager가 위치서비스를 요청할 때 내부적으로 사용되는 매소드이다. vie..
들어가기 앞서, MapKit은 SwiftUI로 간편하게 구현할 수 있고, 커스텀하기도 편하다. https://developer.apple.com/documentation/mapkit/ MapKit | Apple Developer Documentation Display map or satellite imagery within your app, call out points of interest, and determine placemark information for map coordinates. developer.apple.com 공식문서를 통해서, WWDC 2023에서 발표한 영상과 설명에 따르면, 개발자가 SwiftUI에서 기능 구현을 자유롭게 할 수 있도록 다양한 매소드와 인스턴스를 제공한다. http..
코어데이터를 활용하기 위한 CoreDataManager 더보기 // // CoreDataManager.swift // Run-It // // Created by t2023-m0024 on 2/29/24. // import Foundation import CoreData import KakaoSDKUser class CoreDataManager { static let shared = CoreDataManager() private init() {} // MARK: - Core Data stack lazy var persistentContainer: NSPersistentContainer = { let container = NSPersistentContainer(name: "Run_It") container...
https://medium.com/@Ariobarxan/ios-application-scene-delegate-vs-app-delegate-a-talk-about-life-cycle-a2ecae9d507e iOS Application Scene Delegate VS App Delegate(A talk about Life cycle) Preface medium.com IOS 13부터는 AppDelegate와 SceneDelegate의 책임이 구분되었다. -> 해석하자면, AppDelegate는 과거에 출시, 종료, 시스템 수준 이벤트 처리 등 앱의 전반적인 라이프사이클을 처리한다. 초기 앱 환경 설정, 앱 수준의 데이터 및 리소스 관리, 푸시 알림 처리 등을 담당한다. 반면에 SceneDelegate는 여..
문제 풀이 func solution(_ s: String, _ n: Int) -> String { let lowerCaseLetters = Array("abcdefghijklmnopqrstuvwxyz") let upperCaseLetters = Array("ABCDEFGHIJKLMNOPQRSTUVWXYZ") var result = "" for char in s { if char == " " { result.append(" ") continue } let letters = char.isLowercase ? lowerCaseLetters : upperCaseLetters if let index = letters.firstIndex(of: char) { let shiftedIndex = (index + n) ..
Timer 클래스를 활용해서, 러닝기록 타이머를 구현하려 시도했다. 러닝기록 타이머 만들기(1/3, 2/3)의 글을 통해서 시도하였을 때, 옵셔널 체이닝 방식으로 MyTimer 클래스에서 타이머를 RunLoop에 등록해서 Main thread에서 해당 매소드가 구동되게금 구현하였다. 하지만, Timer 클래스에는 일시정지하는 매소드나 재실행하는 매소드가 없어서 MyTimer 클래스의 코드의 로직이 부족하다. 따라서 dispatchsource 클래스를 활용해서 타이머 클래스를 다시 정의하였다. https://developer.apple.com/documentation/dispatch/dispatchsource DispatchSource | Apple Developer Documentation An obje..
https://www.youtube.com/watch?v=Lb7OShyNSdM https://developer.apple.com/documentation/backgroundtasks/ Background Tasks | Apple Developer Documentation Request the system to launch your app in the background to run tasks. developer.apple.com https://velog.io/@yoosa3004/iOS-Background-Mode-Background-Task [iOS] Background Mode, Background Task 오늘은 BackgroundMode와 BackgroundTask에 대해 정리해보겠습니다.iOS앱은..