iOS14中小组件的简单解析

2020-11-26  本文已影响0人  tino又想吃肉了

小组件(Widget)可以在主屏幕上实现内容展示和功能跳转。 系统会向小组件获取时间线(TimeLine),根据当前时间对时间线上的数据进行展示。点击正在展示的视觉元素可以跳转到APP内,实现对应的功能。

Widget技术栈

16063822333913.jpg

关键词

Provider

当我们使用Xcode新建一个小组件项目时,Xcode会为我们实现一个默认效果的小组件。

func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> ()) {
        let entry = SimpleEntry(date: Date())
        completion(entry)
    }
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> ()) {
        var entries: [SimpleEntry] = []
        let currentDate = Date()
        for hourOffset in 0 ..< 5 {
            let entryDate = Calendar.current.date(byAdding: .hour, value: hourOffset, to: currentDate)!
            let entry = SimpleEntry(date: entryDate)
            entries.append(entry)
        }

        let timeline = Timeline(entries: entries, policy: .atEnd)
        completion(timeline)
    }

WidgetEntryView

这个结构体是我们用来展示的视图view,我们可以在里面进行UI的搭建。

struct WidgetEntryView : View {
    var entry: Provider.Entry
    var body: some View {
        Text(entry.date, style: .time)
    }
}

@main

@main
struct TestWidget: Widget {
    let kind: String = "TestWidget"

    var body: some WidgetConfiguration {
        StaticConfiguration(kind: kind, provider: Provider()) { entry in
            TestWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("My Widget")
        .description("This is an example widget.")
        //supportedFamilies不设置的话默认三个样式都实现
        .supportedFamilies([.systemSmall, .systemMedium, .systemLarge])
    }
}

如果我们需要为app创建多个widget呢?

那么 这时候我们就需要用到WidgetBundle协议了

struct YourWidgets: WidgetBundle {
    @WidgetBundleBuilder
    var body: some Widget {
        OneWidget()
        TwoWidget()
        ThreeWidget()
        ......  
    }
}

关于数据

static func request(completion: @escaping (Result<Poetry, Error>) -> Void) {
        let url = URL(string: "")!
        let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
            guard error == nil else {
                completion(.failure(error!))
                return
            }
            
            completion(.success(xxx))
        }
        task.resume()
    }

关于跳转

跳转是小组件的一个重要功能,如果只实现了简单的数据展示的话小组件并不能成为一个流量入口

总结

上一篇下一篇

猜你喜欢

热点阅读