HealthKit (3)
Simulator에서 MockData가 필요한 이유
시뮬레이터 환경 제약:
HealthKit은 시뮬레이터에서 기본적으로 데이터를 수집하거나 저장할 수 없다.
데이터를 입력하거나 확인할 수 있는 기능이 제한적이기 때문에 MockData를 통해 시뮬레이터 환경에서도 동작을 검증할 수 있다.
수동 데이터 입력의 번거로움 제거:
Health 앱에서는 데이터를 수동으로 추가할 수 있지만, 하루 단위로 데이터를 하나씩 입력하는 것은 매우 번거롭고 시간이 오래 걸린다.
MockData 생성을 통해 대량의 데이터를 자동으로 추가함으로써 이러한 ...
HealthKit (2)
HealthKit Permission 요청하기
HealthKit GuideLine을 한번 읽어보도록 하자
디자인은 생략.
HealthKit Image Download는 여기
한가지 중요한 점이 있다면. 해당 앱을 사용하는 Device가 HealthKit을 지원하는지 반드시 체크해야한다.
When you enable the HealthKit capabilities on an iOS app, Xcode adds HealthKit to the list of required device capabilities, which prevents users from purchasing or installing t...
HealthKit (1)
HealthKit을 사용한 앱을 만드는 걸 공부하면서 기록을 적어본다.
가급적 UI디자인은 크게 언급할 부분이 없다면 생략을 하면서 가도록 하겠다.
첫 화면의 디자인은 다음과 같다.
Picker(Segmented) 적용하기
현재 디자인이 된 상태에서 Picker를 사용하여 step을 고를지, weight를 고를지를 정해본다.
Picker를 구현하기 앞서
enum을 통해 각 케이스를 구별해준다.
enum HealthMetricContext {
case steps, weight
var title: String {
switch self {
case .s...
WidgetKit (Fin)
UI 디자인
UI를 그대로 디자인하면 가독성이 떨어지니 새로운 SwiftUI View파일을 만들어 거기에 디자인을 하도록 한다.
LiveActivityView로 만들었다.
코드는 생략
Preview는 위와 같은데 버전의 차이로 양사이드 여백이 생기는건 이후에 해결 예정
GameLiveActivity 설정
struct GameLiveActivity: Widget {
var body: some WidgetConfiguration {
ActivityConfiguration(for: GameAttributes.self) { context in
// Lock scre...
WidgetKit (16)
BasketballSim 이라는 앱으로 Dynamic Island & LiveActivity를 구현하려고 한다.
해당프로젝트의 기본적인 내용은 이미 만들어진걸 사용해서 패스
Dynamic Island와 Live Activity
Live Activity: 잠금 화면 및 배너에 실시간 정보를 제공.
Dynamic Island: iPhone 14 Pro 이상에서 상단 영역에 동적으로 실시간 데이터를 표시.
Displaying live data with Live Activities, Live Activities - Human Interface Guidelines 이거 두개를 한번 읽어보는걸 추천
...
WidgetKit (15)
이렇게 SwiftCal 앱의 LockScreen을 디자인한다.
이번에 적용할 프로젝트는 CoreData Version으로 된 걸 사용했다.
EntryView를 각 Case 별로 분류
우선 환경변수 @Environment(\.widgetFamily) var family를 만들어 준다.
Widget의 Supported Family 수정
LockScreen의 위젯을 지원해야 하므로
struct SwiftCalWidget: Widget {
let kind: String = "SwiftCalWidget"
var body: some WidgetConfiguration {
Sta...
WidgetKit (14)
LockScreen Widget 적용하기
SingleRepo, DoubleRepo가 있는 RepoWatcher를 가져왔다.
기존 SingleRepoEntryView에서
struct SingleRepoEntryView : View {
@Environment(\.widgetFamily) var family
var entry: SingleRepoEntry
var body: some View {
switch family {
case .systemMedium:
//생략
case .systemLarge:
//생략
...
WidgetKit (13)
Concurrency & Tinted 적용 (iOS 18)
이전에 MainActor를 사용 하면서 뜬 Warning이 있다.
바로 이것.
이전에 에러가 떴던 이유는 CoreData를 사용할때
@MainActor func fetchDays() -> [Day] {
// 중간 생략..
return try! container.mainContext.fetch(descriptor)
}
바로 여기서 mainContext를 사용했기 때문
?
그렇기에 해당 경고가 떴던 것.
지금은 그게 아니기에 @MainActor를 전부 지워준다.
func getSnapshot(in context...
631 post articles, 79 pages.