일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Timer
- dispatchsource
- 영문 개인정보처리방침
- 단일 책임원칙
- xcode로 날씨앱 만들기
- AnyObject
- addannotation
- weak var
- swift
- 서체관리자
- UIAlertAction
- Xcode
- UICollectionViewFlowLayout
- Startign Assignments
- SwiftUI Boolean 값
- 러닝기록앱
- RunningTimer
- MKMapItem
- CoreLocation
- 클로저의 캡슐화
- Required Reason API
- font book
- 러닝타이머
- MKMapViewDelegate
- Protocol
- weatherKit
- WeatherManager
- CLLocationManagerDelegate
- 한국어 개인정보처리방침
- App Store Connect
- Today
- Total
목록Xcode Study (162)
VesselWheel
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..
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://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..
문제점 사용자가 움직이지 않거나, 실내일 때에는 거리값이 증가하지 않고, 따라서 페이스 또한 증가하지 않아 Nil인 상태이다. 이로 인해, 코어데이터에서 러닝기록을 호출하는 프로필뷰를 탭했을 때, 오류로 인해 기기에서는 앱이 멈추거나 자동종료 되는 문제가 발생했다. 원인 - runningRecord.pace 값은 NaN 상태로 값이 없다. 상기 상황에서 정지버튼을 누르면 runningRecord.pace는 NaN 상태로 코어데이터에도 저장된다. - runningRecord.pace 값이 NaN으로 null 상태일 때, Int값으로 형변환을 할 수 없음. 해결방법 우선 xcode 무한값 유한값을 검색했다. 한글로 검색하니 상관있는 검색결과가 나오지 않는다. 영어로 무한값 infinite, 유한값 finit..
문제점 오늘도 트러블 메이커, 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..
앞선 게시물에 이어서, 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는 여..
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앱은..
이 글은 1/3에서 활용한 Timer 클래스의 커스텀 매소드를 호출하여 View에서 호출하는 로직을 구현하였다. MyTimer Class 더보기 // // MyTimer.swift // Run-It // // Created by Jason Yang on 2/26/24. // import UIKit import CoreLocation class MyTimer { var timer: Timer? var time = 0 var distance = 0.0 var pace = 0.0 var pausedTime = 0 // 일시정지된 시간을 저장할 변수 var pausedDistance = 0.0 // 일시정지된 거리를 저장할 변수 var pausedPace = 0.0 // 일시정지된 페이스를 저장할 변수 var ..
https://m.cafe.daum.net/kyongcj/9Lg8/4068?listURI=%2Fkyongcj%2F9Lg8 능소부능대(能小復能大) 능소부능대(能小復能大)작은 일을 잘할 수 있어야 다시 큰일도 잘하는 법이다.能 : 능할 능(月/6)小 : 작을 소(小/0)復 : 다시 부(彳/9)能 : 능할 능(月/6)大 : 큰 대(大/0)출전 : 태평어람(太平御覽) 0346 m.cafe.daum.net 오늘도 내배캠 매니저님은 원생들의 TIL 작성에 고심을 하고 있으시다. 바로 TIL, Today I Learned https://doing7.tistory.com/4 [Github] TIL 작성법 * TIL? Today I Learned의 약자. 그날그날 내가 공부한 것을 정리하는 것이다. 미국에서는 흔하게 사..
결론부터 말하자면, dispatchsource 클래스를 활용하여 러닝기록 타이머를 구현한다. 이 글의 마지막으로 내려가서 (3/3) 의 글을 보시고, 이해를 위해서 현재 보고 있는 글을 참고하시라. 공식문서를 읽기 전에 참고 블로그로 대략적인 흐름에 대해 이해하려했다. https://please-amend.tistory.com/entry/Swift-Timer%ED%83%80%EC%9D%B4%EB%A8%B8%EC%99%80-Thread%EC%8A%A4%EB%A0%88%EB%93%9C-RunLoop%EB%9F%B0%EB%A3%A8%ED%94%84 [iOS] Timer(타이머)와 Thread(스레드), RunLoop(런루프) ** 아직 공부하는 중이라 틀린 내용이 있을 수도 있습니다. ** 최근 프로젝트에서 ..
https://developer.apple.com/documentation/uikit/uipageviewcontroller UIPageViewController | Apple Developer Documentation A container view controller that manages navigation between pages of content, where a child view controller manages each page. developer.apple.com
들어가기 앞서, 앱에서 지도를 구현할 때 다양한 지도 서비스가 있다. 지도 API를 비교한 블로그글을 참고하면 성능부터 비용까지 자신의 앱에 알맞는 서비스를 선택할 수 있다. [지도 API 비교 블로그] 더보기 https://epdev.tistory.com/8 지도 API 비교(구글, 네이버, 카카오) 이전에 안드로이드 앱을 만들 때, 보통 사용하는 지도 API 세 개(구글, 네이버, 카카오)를 비교했던 결과를 올린다. 비교일은 2020년 2월 중순으로 현재 기준과 다소 차이가 날 수 있다는 점은 참고 epdev.tistory.com 비용성 측면에서 다양한 기능을 제공하는 상업성 지도(구글, 네이버, 카카오)는 궁극적으로 비용이 발생 하지만 Mapkit은 비용이 발생하지 않고, 퍼스트파티로 UIkit과의..
https://nbcamp.spartacodingclub.kr/blog/내일배움캠프-우수-til-앱-과정-2기-2월-2-3주차--16353 내일배움캠프 우수 TIL | 앱 과정 2기 2월 2, 3주차 - 내일배움캠프 블로그 TIL 작성 방법이 궁금한가요? 내일배움캠프 수강생들의 우수 TIL을 참고해 보세요. | 📕수강생 학습일지 nbcamp.spartacodingclub.kr
https://forums.developer.apple.com/forums/thread/700882 Is DTO pattern in iOS really benef… | Apple Developer Forums It depends on your app. If you have a complex app with different layers like services and repositories or DAOS implementing this pattern could be positive for you. You can hide your business logic and improve your memory usage not using data you don't need forums.developer.apple.c..
https://vesselwheel.tistory.com/187 5일치 3시간 단위 날씨예보 배열에 넣기(with OpenWeatherMap) (1/2) https://vesselwheel.tistory.com/185 3시간 단위 5일치 OpenWeatherMap API를 활용한 데이터 호출 기존에 WeatherData를 활용한 현재 날씨 API는 위경도 혹은 도시지역의 현재 날씨 기준으로 실시간 기상예보이다. // vesselwheel.tistory.com 이전 글을 참고하여, API call을 통해 가져온 데이터를 UI에서 사용하기 위해 배열에 넣는 데이터 가공을 하였다. 하지만, 날씨데이터를 가져오는 매소드 안에, 데이터를 배열에 넣는 데이터가공작업을 함께하니 코드가 길어지고 가독성이 떨어지는 문제..
https://vesselwheel.tistory.com/185 3시간 단위 5일치 OpenWeatherMap API를 활용한 데이터 호출 기존에 WeatherData를 활용한 현재 날씨 API는 위경도 혹은 도시지역의 현재 날씨 기준으로 실시간 기상예보이다. // MARK: - public Methods //현재 날씨정보 : LocationManager에서 위치정보를 받고, 위경도 API vesselwheel.tistory.com 상기 주소의 이전글을 참고하여 //위치데이터 1. LocationMager 클래스에서 싱글톤으로 현재위치 혹은 지정위치를 호출하여 위경도를 받으면, // API call 2. WeatherManager의 getForestWeather 매소드가 파라미터로 받은 위경도 기준 지역..
기존에 WeatherData를 활용한 현재 날씨 API는 위경도 혹은 도시지역의 현재 날씨 기준으로 실시간 기상예보이다. // MARK: - public Methods //현재 날씨정보 : LocationManager에서 위치정보를 받고, 위경도 API에 적용한 후, 날씨 데이터 값 복사 : 독립적인 인스턴스 생성 //https://api.openweathermap.org/data/2.5/weather?lat=37.565534&lon=126.977895&appid=3a33f61058f414d02d09e88bfa83117c public func getLocationWeather(latitude: Double, longitude: Double, completion: @escaping(Result) -> Vo..