Include Configuration App Intent
체크WidgetKit
사용TimelineEntry
프로퍼티를 채택해야 함Date
가 필수 속성import Foundation
import WidgetKit
struct WeatherEntry: TimelineEntry {
let widgetData: WidgetData
var date: Date {
widgetData.date
}
}
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> WeatherEntry {
WeatherEntry(widgetData: .preview)
}
func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> ()) {
let entry = WeatherEntry(widgetData: .preview)
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<WeatherEntry>) -> ()) {
var entries = [WeatherEntry(widgetData: .preview)]
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
// func relevances() async -> WidgetRelevances<Void> {
// // Generate a list containing the contexts this widget is relevant in.
// }
}
struct WeatherAppWidget: Widget {
let kind: String = "WeatherAppWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
if #available(iOS 17.0, *) {
WeatherEntryView(entry: entry)
.containerBackground(.fill.tertiary, for: .widget)
} else {
WeatherEntryView(entry: entry)
.padding()
.background()
}
}
.configurationDisplayName("날씨 위젯")
.description("위젯 설명은 여기에 들어갑니다.")
.supportedFamilies([.systemSmall])
}
}
configurationDisplayName
: My Widget 부분에 뜨는 이름
description
: 제목 아래 설명
supportedFamilies
: 지원되는 위젯의 크기 종류
파일 추가 시 접근할 수 있는 범위를 지정할 수 있다.
위젯과 본 앱 모두 접근 가능한 파일이려면 체크해야함.
struct WeatherEntryView_Previews: PreviewProvider {
static var previews: some View {
WeatherEntryView(entry: Provider.Entry(widgetData: .preview))
.previewContext(WidgetPreviewContext(family: .systemSmall))
}
}
var body: some View {
if #available(iOSApplicationExtension 17.0, *) {
ZStack {
LinearGradient(colors: [
Color(red: 4/255, green: 7/255, blue: 24/255),
Color(red: 39/255, green: 54/255, blue: 80/255)
], startPoint: .topTrailing, endPoint: .bottomLeading)
}
.containerBackground(.fill.tertiary, for: .widget)
struct WeatherAppWidget: Widget {
let kind: String = "WeatherAppWidget"
var body: some WidgetConfiguration {
StaticConfiguration(kind: kind, provider: Provider()) { entry in
if #available(iOS 17.0, *) {
WeatherEntryView(entry: entry)
.containerBackground(.fill.tertiary, for: .widget)
} else {
WeatherEntryView(entry: entry)
.padding()
.background()
}
}
.configurationDisplayName("날씨 위젯")
.description("위젯 설명은 여기에 들어갑니다.")
.supportedFamilies([.systemSmall])
//아래 부분 추가
.contentMarginsDisabled()
.containerBackgroundRemovable(false)
}
}
extension FileManager {
static var sharedContainerURL: URL {
return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: "여기사이닝")!
}
}
즉, 파일을 작성,읽음으로서 데이터를 공유
앱에서 새로운 데이터를 받았을 때 write를 하면서 reload 하기
WidgetCenter.shared.reloadAllTimelines()