π WidgetKit μ΄λ ?
πΈ Live Activity μ¬μ©ν΄ 보기
μ΄λ² κΈμμλ iOS 16 λ²μ λΆν° λμ λ μ κΈ νλ©΄μμ 보μ¬μ§λ μμ ―μ λ§λλ λ°©λ²μ λν΄μ μμλ³΄λ €κ³ νλ€.
μ κΈνλ©΄ μμ ―μ WidgetKitμ μ¬μ©ν΄μ λ§λ€ μ μκ³ , κΈ°λ₯λ κ±°μ λμΌνλ€κ³ 보면λλ€.
μ΄μ μ WidgetKitμ λν μ λ°μ μΈ λ΄μ©μ λ€λ€μκΈ° λλ¬Έμ μ΄ κΈμμλ μ€λ³΅λ λ΄μ©μ λ€λ£¨μ§ μμ μμ μ΄λ WidgetKitμ λν΄ λͺ¨λ₯΄μκ±°λ μμΈν μκ³ μΆμ λΆλ€μ μμ 곡μ ν κΈμ μ°Έκ³ νμκΈΈ λ°λλλ€.
ν΄λΉ κΈμμλ WidgetKit κ΄λ ¨ λ΄μ©μ μμ±ν λμ λ€λ£¨μ§ μμλ μ κΈ νλ©΄ μμ ―μ λν΄μλ§ μμ±νλλ‘ νκ² λ€.
WidgetKitμ iOS 14μμ λμ λ μλ‘μ΄ νκ²½μΌλ‘ μ¬μ©μκ° ν νλ©΄μμ μ±μ 컨ν μΈ λ₯Ό λΉ λ₯΄κ² νμΈνκ³ μνΈμμ©ν μ μλλ‘ μΆκ°λ κΈ°λ₯μ΄λ€.
WidgetKitμμλ iOS 16λΆν° μ κΈ νλ©΄μμ μ¬μ©ν μ μλ μλ‘μ΄ μμ ―λ€μ μΆκ°νκ² λμλλ°, μ΄ κΈ°λ₯μ΄ λ°λ‘ μ΄λ² κΈμμ λ€λ£¨κ² λ μμ ―λ€μ΄λ€.
νμμ μ¬μ©νλ μμ ―κ³Ό μ κΈ νλ©΄μμ μ¬μ©νλ μμ ―μ λμΌνκ² κ΅¬μ±λμ΄ μκΈ° λλ¬Έμ μ¬μ© λ°©λ²μ ν¬κ² λ€λ₯΄μ§ μλ€.
Home Widget | Lock Screen Widget |
---|---|
![]() |
![]() |
WidgetKitμ ν΅μ¬ κ΅¬μ± μμμΈ TimelineProvider, Entity, Timelineμ λͺ¨λ 곡μ νκ³ μκΈ° λλ¬Έμ μ¬μ© λ°©λ²μ μμ ν λμΌνλ€κ³ 보면 λλ€.
Widget Extensionμ μΆκ°ν λμ μ¬μ©νλ StaticConfiguration, IntentConfiguration μ€μ μ ν μμ ―μμλ§ κΈ°λ₯μ΄ λ€λ₯΄κ² λκ³ μ κΈ νλ©΄ μμ ―μμλ μ°¨μ΄κ° μλ€κ³ 보면 λλ€.
μ κΈ νλ©΄ μμ ―μ νΈμ§μ΄ λΆκ°λ₯νκΈ° λλ¬Έμ΄λ€.
WidgetKitμ μ’ λ₯ λ° κ΅¬μ± μμμ λν΄μ νμ€ν μ΄ν΄λ₯Ό νκ³ μμ΄μΌ νκΈ° λλ¬Έμ μ΄ν΄κ° μλμ λ€λ©΄ μμ 곡μ ν κΈμ μ½μ΄λ³΄μκΈΈ κΆμ₯ν©λλ€.
μ΄μ 본격μ μΌλ‘ μ κΈ νλ©΄ μμ ―μ μ¬μ©ν΄ 보μ.
μ κΈ νλ©΄μμ μ¬μ©ν μ μλ μμ ―μ accessoryInline, accessoryRectangular, accessoryCircular μ΄λ κ² 3κ°μ§ μ’ λ₯κ° μκ³ , κ°κ° νλ©΄μμ 보μ¬μ€ μ μλ μ¬μ΄μ¦κ° μ νλμ΄ μλ€.
accessoryInline accessoryRectangular accessoryCircular
Widget Extensionμ μΆκ°νμ.
File > Target
μνλ μμ ―μ μ΄λ¦μ μ νκ³ λ§λ€μ΄ μ£Όλ©΄ λλλ° "include Configuration App Intent" μ ννκ³ μμ±νλ©΄ IntentConfiguration μμ ―μΌλ‘ μμ±λκ³ ν΄μ νκ² λλ©΄ StaticConfigurationμΌλ‘ μμ±μ΄ λλ€.
Live Activityκ° νμν κ²½μ°λΌλ©΄ 체ν¬ν΄μ μμ±ν΄μ£Όλ©΄ λλ€.
μ΄μ μ κΈ νλ©΄ μμ ― μ¬μ©μ μν΄ μ¬μ©νκ³ μ νλ μμ ― νμ λ€μ μΆκ°ν΄λ³΄λλ‘ νμ.
λ§μΌ μΆκ°νμ§ μκ³ κΈ°λ³Έ μνλ‘ λλ€λ©΄ μ κΈ νλ©΄ μμ ―μ μ μΈν μμ ―λ€λ§ μμ±μ΄ λλ€.
supportedFamiliesλ₯Ό μ¬μ©ν΄ μνλ μμ ― νμ λ€μ λ°°μ΄ ννλ‘ λ£μ΄μ£Όλ©΄ λλ€.
νμν μ κΈ νλ©΄ μμ ―λ€μ λ£μ΄μ£Όλ©΄ λλ€.
supportedFamilies([.accessoryInline, .accessoryCircular, .accessoryRectangular])
ν μμ ―λ ν¨κ» μ¬μ©νκ³ μΆλ€λ©΄ ν μμ ―μ μ¬μ΄μ¦λ μΆκ°ν΄μ£Όλ©΄ λλ€.
supportedFamilies([.systemSmall, .systemMedium, .accessoryInline, .accessoryCircular, .accessoryRectangular])
νμ¬ μλΉμ€κ° iOS 16 μ΄νλ₯Ό νκ²νκ² λλ©΄ μ κΈνλ©΄ μμ ―μ μ¬μ©ν μ μκΈ° λλ¬Έμ λΆκΈ° μ²λ¦¬λ₯Ό ν΄μ£Όμ΄μΌ νλ€.
private let supportedFamilies: [WidgetFamily] = {
if #available(iOS 16.0, *) {
return [.systemSmall, .accessoryCircular, .accessoryInline, .accessoryRectangular]
} else {
return [.systemSmall]
}
}()
Viewλ₯Ό λΆλ¦¬ν΄ μ€ νμκ° μλλ°, ν νλ©΄μμ μ¬μ©ν μμ ―κ³Ό μ κΈ νλ©΄μ μμ ―λ€μ μ¬μ΄μ¦μ μ°¨μ΄κ° λ§κΈ° λλ¬Έμ UI ꡬμ±μ λ³λλ‘ ν΄μ£Όλ κ²μ΄ μ’λ€.
νκ²½ λ³μλ‘ widgetFamilyλ₯Ό μ¬μ©ν΄ μ¬μ΄μ¦λ₯Ό κ°μ Έμ¬ μ μλ€.
struct LockScreenWidgetEntryView : View {
@Environment(\.widgetFamily) private var widgetFamily
var entry: Provider.Entry
var body: some View {
switch widgetFamily {
case .accessoryInline:
InlineView()
case .accessoryCircular:
CircularView()
case .accessoryRectangular:
RectangularView()
case .systemSmall:
SmallView()
default:
EmptyView()
}
}
}
μμ ―μ UI μ€μ μ΄λ€ μμ ―μ λ°±κ·ΈλΌμ΄λ μμμ΄ μκ³ , μ΄λ€ μμ ―μ λ°±κ·ΈλΌμ΄λ μμμ΄ λ³΄μ¬μ§μ§ μμ κ²μ΄λ€.
μ κΈ νλ©΄ μμ ―μμλ§ μ¬μ©νλ AccessoryWidgetBackground κ°μ²΄λ₯Ό μ¬μ©ν΄ λ°±κ·ΈλΌμ΄λ μμμ μΆκ°ν μ μλ€.
ZStackμ μ¬μ©ν΄μ λ°±κ·ΈλΌμ΄λλ₯Ό μΆκ°ν΄μ£Όλ©΄ λλ€.
struct CircularView : View {
var body: some View {
ZStack {
AccessoryWidgetBackground()
Text("Sample")
}
}
}
accessoryCircular νμ μ μνμ΄κΈ° λλ¬Έμ λ°±κ·ΈλΌμ΄λλ₯Ό μΆκ°ν΄λ λ λμ°μ€λ₯Ό λ³λλ‘ μ€μ ν νμκ° μμ§λ§ accessoryRectangular νμ μ λ°±κ·ΈλΌμ΄λ μμμ μΆκ°νκ³ μΆλ€λ©΄ λ λμ°μ€μ λν κ°λ μΆκ°λ‘ μ§μ ν΄ μ£Όμ΄μΌ νλ€.
cornerRadiusλ₯Ό μ¬μ©ν΄ μνλ λ λμ°μ€λ₯Ό μ€μ ν μ μλ€.
AccessoryWidgetBackground().cornerRadius(12)
μ΄λ²μλ λλ°μ΄μ€ μ¬μ΄μ¦μ μν΄ μνλ μμ ―μ΄ μ리λ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ λν΄μ μμ보λλ‘ νκ² λ€.
보μ¬μ£Όκ³ μ νλ UI λ³΄λ€ λλ°μ΄μ€ μ¬μ΄μ¦κ° μμ μ€μν νμκ°λ μλ μλ λ¬Έμ κ° μλ€.
μ 체 UIκ° νλ©΄μ 보μ¬μ§μ§ μκ³ μ리λ κ²½μ°λ₯Ό λλΉνμ¬ λ체 μμ ―μ 미리 μΆκ°νμ¬ λλ°μ΄μ€κ° 보μ¬μ€ μ μλ μμμ λ§λ μ¬μ΄μ¦μ μμ ―μ μλμΌλ‘ λ ΈμΆ μν€λλ‘ μ§μνκ³ μλ€.
15 Pro Max 15 Pro
μμ 15 Pro Maxμ 15 Proμ μ¬μ΄μ¦ μ°¨μ΄λ‘ μΈνμ¬ accessoryInlineμ λ ΈμΆλλ λ¬Έμκ° λ€λ₯Έ κ²μ νμΈν μ μλ€.
ViewThatFitsλ₯Ό μ¬μ©ν΄ 미리 λ체 μμ ―λ€μ μΆκ°ν΄ λλ©΄ λͺ¨λ λλ°μ΄μ€ μ¬μ΄μ¦μ μ μ ν UIλ₯Ό 보μ¬μ€ μ μκ² λλ€.
struct InlineView : View {
var body: some View {
ViewThatFits {
Text("Lock screen widget test π")
Text("Lock screen test π₯")
Text("Lock screen π")
}
}
}
μμ ―μ λ°μ΄ν°λ₯Ό 리νλ μνλ λ°©λ²μ λν΄μλ μ΄μ μ μμ±ν WidgetKitμ μ¬μ© λ°©λ²κ³Ό λμΌνλ ν΄λΉ κΈ μ°Έκ³ νμ μ TimelineProvider, Timeline, Entryλ‘ κ΅¬μ±λ μμλ₯Ό μ¬μ©νμλ©΄ λκ³ , WidgetCenterλ₯Ό μ¬μ©ν μ¦μ μ λ°μ΄νΈμ λν΄μλ νμΈν μ μλ€.
μ¬κΈ°μλ λ³λλ‘ μ¬μ© λ°©λ²μ λν΄μλ μμ±νμ§ μλλ‘ νκ² λ€.
WidgetKitμ μ¬μ©ν΄ μ κΈ νλ©΄ μμ ―μ λ§λλ λ°©λ²μ λν΄μ κ°λ¨νκ² μμ보μλ€.
κΆκΈνμ μ¬ν μκ±°λ μ λͺ» μμ±λ λ΄μ©μ΄ μλ€λ©΄ λκΈ λ¨κ²¨μ£ΌμΈμ !
κ°μ¬ν©λλ€.