IOS Firebase 后台获取

Posted

技术标签:

【中文标题】IOS Firebase 后台获取【英文标题】:IOS Firebase background fetch 【发布时间】:2016-04-13 08:00:52 【问题描述】:

根据教程,我在 swift 2.0 上使用后台获取时遇到问题 -> https://www.raywenderlich.com/92428/background-modes-ios-swift-tutorial3。 我收到此错误: application:performFetchWithCompletionHandler: 但从未调用过完成处理程序。

基本上我有一个功能,我可以在其中执行我的操作(在 firebase 上调用数据),我希望它在后台执行。

这是我的应用委托代码

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 
UIApplication.sharedApplication().setMinimumBackgroundFetchInterval(
    UIApplicationBackgroundFetchIntervalMinimum)



func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 

    if let tabBarController = window?.rootViewController as? UITabBarController,
        viewControllers = tabBarController.viewControllers! as [UIViewController]!
    
        for viewController in viewControllers 

            if let a1 = viewController as? HorariosViewController 
              completionHandler(.NewData)
              a1.interface()   
            
        
    

这是我如何通过接口函数从 firebase 获取数据:

func interface() 

                self.numeroDasOrações = []
                self.adhan = []

                if let snapshots = snapshot.children.allObjects as? [FDataSnapshot] 

                    for snap in snapshots 
                        if let postDictionary = snap.value as? Dictionary<String, AnyObject> 
                            let key = snap.key
                            let hSalat = Horarios(key: key, dictionary: postDictionary)
                            let hAdhan = Horarios(key: key, dictionary: postDictionary)

                            self.numeroDasOrações.append(hSalat)
                            self.adhan.append(hAdhan)

                        
                    
                
            )

Xcode 错误:

警告:应用程序委托收到了对 -application:performFetchWithCompletionHandler: 的调用,但从未调用过完成处理程序。

提前致谢。

【问题讨论】:

请显示您的代码...以及来自 XCode 的确切错误/警告消息... @kishan94 我刚刚编辑了我的问题。 我认为completionHandler调用应该是completionHandler(UIBackgroundFetchResult.NewData) 您的代码中似乎没有 Firebase 观察或查询功能,因此不清楚快照的来源。将异步代码作为后台进程运行可能会导致其他问题,但这取决于用例是什么。 【参考方案1】:

使用application(_:didReceiveRemoteNotification:) 时,无论如何都必须始终调用完成处理程序。 Apple 的政策是,如果您的 fetch 找到了新数据,您调用 completionHandler(.newData),如果您的 fetch 没有找到任何新数据,则调用 completionHandler(.noData),如果您的 fetch 找到了新数据,但在尝试检索它时失败了,则调用 completionHandler(.failed)

在您的代码中,仅在满足某些条件时才调用完成处理程序。您应该调用completionHandler(.failed)completionHandler(.noData),而不是不调用完成处理程序。

因此,您的最终代码(针对 Swift 3 更新)将是:

func application(application: UIApplication, performFetchWithCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) 
    var newData = false
    if let tabBarController = window?.rootViewController as? UITabBarController,
        viewControllers = tabBarController.viewControllers! as [UIViewController]!
    
        for viewController in viewControllers 
            if let a1 = viewController as? HorariosViewController 
                newData = true
                a1.interface()   
            
        
    
    completionHandler(newData ? .newData : .failed) // OR completionHandler(newData ? .newData : .noData)

【讨论】:

以上是关于IOS Firebase 后台获取的主要内容,如果未能解决你的问题,请参考以下文章

应用不在后台时无法识别 Firebase 动态链接 (iOS)

iOS 应用未收到来自 Firebase 的后台推送通知

Firebase Cloud Messaging 通知未显示在 iOS 设备上(前台和后台)

使用 URLSession 和后台获取以及使用 firebase 的远程通知

Firebase 通知在 iOS 10 上触发错误的委托

Firebase 云消息传递不会创建推送通知,但会获取信息