2

チュートリアルに従って、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: への呼び出しを受け取りましたが、完了ハンドラーは呼び出されませんでした。

前もって感謝します。

4

1 に答える 1

1

使用するときapplication(_:didReceiveRemoteNotification:)は、何があっても常に完了ハンドラを呼び出す必要があります。Apple のポリシーはcompletionHandler(.newData)、フェッチで新しいデータが見つかった場合、フェッチで新しいデータがcompletionHandler(.noData)見つからなかった場合、および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)
}
于 2016-09-24T21:16:35.743 に答える