I really stuck with the problem that my Today Extension widget is not fetching data from Firebase, when it's going to be appeared on screen.
So now I have:
import UIKit
import NotificationCenter
import SwiftUI
import Firebase
class TodayViewController: UIViewController, NCWidgetProviding {
@StateObject var databaseManager = TodayWidgetDatabaseManager()
@StateObject var contacts = FetchContacts() //class for fetching contacts on the phone
override func loadView() {
FirebaseApp.configure()
do {
try Auth.auth().useUserAccessGroup("test.app.id")
} catch let error as NSError {
print("Error changing user access group: %@", error)
}
if #available(iOS 10.0, *) {
self.extensionContext?.widgetLargestAvailableDisplayMode = .expanded
} else {
self.preferredContentSize = CGSize(width: 0, height: 400.0)
}
super.loadView()
}
override func viewDidLoad() {
super.viewDidLoad()
databaseManager.fetchIncomingPolls(contacts: contacts.contacts, completionHandler: {_ in})
}
override func viewWillAppear(_ animated: Bool) {
databaseManager.fetchIncomingPolls(contacts: contacts.contacts, completionHandler: {_ in})
}
@IBSegueAction func addSwiftUIView(_ coder: NSCoder) -> UIViewController? {
return UIHostingController(
coder: coder,
rootView: TodayWidgetView(databaseManager: self.databaseManager, contacts: self.contacts)
)
}
override func viewWillDisappear(_ animated: Bool) {
databaseManager.fetchIncomingPolls(contacts: contacts.contacts, completionHandler: {_ in})
}
func widgetPerformUpdate(completionHandler: (@escaping (NCUpdateResult) -> Void) = {result in return}) {
databaseManager.fetchIncomingPolls(contacts: contacts.contacts) { _ in
completionHandler(NCUpdateResult.newData)
}
}
@available(iOSApplicationExtension 10.0, *)
func widgetActiveDisplayModeDidChange(_ activeDisplayMode: NCWidgetDisplayMode, withMaximumSize maxSize: CGSize) {
if activeDisplayMode == .expanded {
preferredContentSize = CGSize(width: maxSize.width, height: 275.0)
} else if activeDisplayMode == .compact {
preferredContentSize = maxSize
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
I tried to implement fetching data in onAppear() method of SwiftUI view of the widget, also I tried to use my method for fetching data in viewDidLoad() and viewWillAppear() methods in controller. But none of this helped, so widget is only shows "Unable to load" label.