こんにちはEveryDaySoft代表の永田です。最近もiOSのSwiftをメインにFlutterやKotlinなどのプログラムも案件で携わっています。
今回はiOSのWidget自動更新を、共有させていただきます。
iOSのWidget自動更新とは何か?
iOSのWidgetのタイマー機能を使用して更新するプロセスです。開発者が指定した時間で更新するWidgetのTimelineProvider機能を共有させていただきます。https://developer.apple.com/documentation/widgetkit/timelineprovider
TimelineProviderはどのように作成するか。date部分は更新時間に使用します。
textは更新に伴い変化する型です。
struct SimpleEntry: TimelineEntry {
let date: Date
let text: String
}
更新予約させる機能部分
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> SimpleEntry {
SimpleEntry(date: Date(), text: "")
}
func getSnapshot(in context: Context, completion: @escaping (SimpleEntry) -> Void) {
let entry = SimpleEntry(date: Date(), text: "")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<Entry>) -> Void) {
var entries: [SimpleEntry] = []
let currentDate = Date()
var textArray = [String]()
WidgetCenter.shared.reloadAllTimelines()
let array = [0,3,5,7,9]
for i in 0..<array.count {
textArray.append("count:\(array[i])")
}
for i in 0 ..< array.count {
let entryDate = Calendar.current.date(byAdding: .minute, value: array[i], to: currentDate)!
let entryText = textArray[i]
let entry = SimpleEntry(date: entryDate, text: entryText)
entries.append(entry)
}
let timeline = Timeline(entries: entries, policy: .atEnd)
completion(timeline)
}
}
[0,3,5,7,9]の部分は自動更新部分の予約時間です。
ルールとして、開始は0です。要素が増えるにつれて常にプラスが前提です。要素は3以上です。[0,3,5,7,9]の場合は開始0から3分後、5分後といった順番でループします。画像は3分後にcount:の値が0から3に変更した挙動です。次は2分後に値が5になります。9の要素から0に変更するのは1分以内に更新します。

WidgetCenter.shared.reloadAllTimelines()という全体更新する機能は上記の予約システムが正しく動かないと機能しませんでした。上記の法則を利用している場合には、殆ど正確に動きました。
全体のwidgetを更新するテクニックとしては、AppGroupを使用し、UserDefaultsを使用して保存機能を使用するのがよいと思います。ユニークな値を保存名にすると、それをキーに更新ロジックを組めると思います。
このようなWidget機能の自動更新テクニックを使用するとユーザーが決めた時間でWidgetの、データ、デザインを変化できるような導線も作成可能になります。
AppleのWidgetの更新回数はこちらで明記があります。
https://developer.apple.com/documentation/widgetkit/keeping-a-widget-up-to-date
以上、貴重な時間お読み下さいまして、誠にありがとうございます。
No responses yet