
위젯 러버로써, iOS 위젯을 어떻게 만드는지 궁금해서 해봤다
프로젝트는 기존에 앱 프로젝트 생성하는 것과 동일하게 프로젝트를 생성했다
상단 메뉴에서 File > New > Target 클릭

widget Extension을 선택하고 Next

Product Name을 입력하고 Finish 하면 끝이다

Build Settings에서 iOS Development Target을 가장 최신 버전으로 선택해주자

아무것도 건들지 않고 빌드를 해보면 아래처럼 비어있는 위젯을 만날 수 있다
빌드했을 때, 위젯에 아래와 같은 문구가 뜬다
Please adopt containerBackground Api
iOS 17 이상인 경우 발생하는 이슈라고 한다
개발자 문서를 보면 다음의 예제를 따라하면 해결할 수 있다고 한다

Text("")
.containerBackground(for: .navigation) {
// ...
}
View가 적힌 코드에 적용해보았다
struct LogWidgetEntryView : View {
var entry: Provider.Entry
var body: some View {
Text(entry.date, style: .time)
.containerBackground(for: .widget) {
// ...
}
}
}
iOS 17.0 이상인 경우에만 발생하는 이슈라고 하는데, iOS 17.0 이하 버전에서도 쓸 수 있게 하려면 예외처리를 해줘야하는 듯 하다
struct LogWidgetEntryView : View {
@Environment(\.widgetFamily) private var widgetFamily
var entry: Provider.Entry
var body: some View {
Text(entry.date, style: .time)
.widgetBackground()
}
}
extension View {
func widgetBackground() -> some View {
if #available(iOSApplicationExtension 17.0, *) {
return containerBackground(for: .widget) {
// ...
}
} else {
return background()
}
}
}
View의 extension을 만들어주고, iOS 17.0 이상인 경우엔 containerBackground()를, 이하인 경우엔 background()를 리턴하도록 해봤다
잘 동작한다!!
이제 위젯을 생성하는 것까진 했다
역시나, 시작이 반이다