How to fetch data from Firebase on widget appearing in Today Extension?

116 Views Asked by At

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.

0

There are 0 best solutions below