Widget.md

This commit is contained in:
Stuart Breckenridge 2020-07-11 22:24:49 +08:00
parent c3d4834879
commit 300d1eac60
No known key found for this signature in database
GPG Key ID: 79BD673276AE83CE
1 changed files with 18 additions and 25 deletions

View File

@ -4,39 +4,32 @@
The NetNewsWire iOS widget supports the `systemSmall` and `systemMedium` styles.
The `systemSmall` style displays the current Today and Unread counts; `systemMedium` displays the latest two articles.
For the purpose of this PoC: the `systemSmall` style displays the current Today and Unread counts; `systemMedium` displays the latest two articles.
## Passing Data from the App to the Widget
Data is made available to the widget by encoding JSON data and saving it to a file in a directory available to app extensions.
Data is made available to the widget by encoding smart feed and article data as JSON, and saving it to a file in a directory available to app extensions.
Three `struct`s are responsible for this:
```
struct WidgetData: Codable {
let currentUnreadCount: Int
let currentTodayCount: Int
let latestArticles: [LatestArticle]
let lastUpdateTime: Date
}
struct LatestArticle: Codable {
let feedTitle: String
let articleTitle: String?
let articleSummary: String?
let feedIcon: Data? // Base64 encoded image data
let pubDate: String
}
```
- `WidgetDataEncoder` (which is available to the app);
- `WidgetDataDecoder` (which is available to the widget); and,
- `WidgetData` (which is available to both app and widget, and includes the data neccessary for the widget to function)
## When is JSON Data Saved?
1. When the app enters the background
2. After a background refresh
1. When the app enters the background (monitored via the `scenePhase` changing (tested)); or,
2. After a background refresh (untested at the time of writing)
Encoding tasks are fenced in
```
UIApplication.shared.beginBackgroundTask
_{ encoding task }_
UIApplication.shared.endBackgroundTask
```
in order to ensure that the file can be written with sufficient time to spare.
After JSON data is saved, Widget timelines are reloaded.
After JSON data is saved, Widget timelines are reloaded.