Accessing Widget Models
Minimum SDK Version
2.11
This is an iOS guide on Widget Models as part of the Custom Widget UI system. For an overview on Custom Widget UI see Building Custom Widget UI.
What are Widget Models?
Widget Models are representations of a Widget as it is on the server. Widget Models give you the access to read a Widget's data, submit votes, and observe changes to the Widget. Ultimately, a Widget Model provides everything for you to build Custom UI to support your use case.
While each Widget has a unique Widget Model class that represents it, they are encapsulated under the WidgetModel enum TODO LINK in order to simplify the access methods. Use a switch
statement on WidgetModel to get the exact Widget Model.
There are 3 ways to access/retrieve a Widget Model to support various use-cases. All 3 methods require a ContentSession. For more information on Content Session see Getting Started.
Subscribing to Realtime Widget Models
Implement the ContentSessionDelegate to observe when a Widget is published by the Producer.
class MyViewController: UIViewController {
let session: ContentSession
override func viewDidLoad() {
super.viewDidLoad()
session.delegate = self
}
}
extension MyViewController: ContentSessionDelegate {
func contentSession(_ session: ContentSession, didReceiveWidget widgetModel: WidgetModel) {
switch widgetModel {
// Do something with widgetModel
}
}
}
Get a Widget Model by ID
If you know the widget id and kind you can choose to fetch the widget model from the server.
class MyViewController: UIViewController {
let session: ContentSession
let widgetID: String
let widgetKind: WidgetKind
override func viewDidLoad() {
super.viewDidLoad()
session.getWidgetModel(id: widgetID, kind: widgetKind) { result in
switch result {
case .success(let widgetModel):
switch widgetModel {
// Do something with widgetModel
}
case .failure(let error):
// handle error
}
}
}
}
getWidgetModels()
The
getWidgetModels()
SDK interface will be available in iOS SDK version 2.37
Getting Widget Models
This method can be used to fetch a paginated result of Widgets Models filtered by the options
parameter.
The request filters and sorts are defined in the GetWidgetsRequestOptions
struct.
The filtering options include:
- widgetKind - The set of widget kinds to include
- widgetStatus - The publishing status of the widget
- widgetOrdering - The order in which the widgets will be returned
- interactive - Filters for only widgets that can still be interacted with
- since - A Date parameter that filters out widgets with an earlier created date
class MyViewController: UIViewController {
let session: ContentSession
override func viewDidLoad() {
super.viewDidLoad()
let options = GetWidgetModelsRequestOptions(
widgetStatus: .published,
widgetKind: [.textPoll, .imagePrediction],
widgetOrdering: .recent
)
session.getWidgetModels(
page: .first,
options: options
) { result in
switch result {
case let .success(widgets):
case let .failure(error):
}
}
}
}
Get Published Widget Models from History
For use-cases like a Timeline mode, you can perform a paginated fetch of the most recent widget models (~20) on the server. Call with .first
to get the first page then you may call using .next
for subsequent pages.
class MyViewController: UIViewController {
let session: ContentSession
override func viewDidLoad() {
super.viewDidLoad()
session.getPostedWidgetModel(page: .first) { result in
switch result {
case .success(let widgetModels):
switch widgetModel {
// Do something with widgetModel
}
case .failure(let error):
// handle error
}
}
}
}
Interaction History
Available in version 2.24
For many use-cases you may be interested in loading the user's interaction history on a widget. You can do this by calling the loadInteractionHistory
method on interactive Widget Models. Widgets can have multiple interactions so you can order them by the interaction's createdAt
property or use the mostRecentVote
helper property (mostRecentAnswer
on QuizWidgetModel).
If loading widget models using the ContentSession().getPostedWidgetModel
method then interaction history will automatically be loaded, you do not have to call loadInteractionHistory
.
Analytics
To improve the accuracy of our built-in analytics and give you stronger insight into how well your Widgets are performing, you should do the following:
- Call the
registerImpression
method whenever your Widget UI appears on the screen for the User. - Call the
markAsInteractive
method whenever your Widget UI becomes interactive for the User. Interactive is loosely defined and depends on your specific implementation and use-case. Typically, the Widget is interactive when user is able to submit votes/answers or open links in the case of Alert Widgets. (Available in version 2.22)
Updated 10 months ago