これを適切に使用する方法については明確ではありませんが、他の人がこの種のことをしているのを見たことがあります:
func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
manager.sharedInstance.backgroundCompletionHandler = completionHandler
}
同様の実装では、この時点completionHandler
でpartial apply forwarder for reabstraction thunk helper...
manager
基本的に(シングルトンであるにもかかわらず)どこにありますか:
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.ourcompany.app")
let manager = Alamofire.Manager(configuration: configuration)
ただし、これにより、次の警告がコンソールに出力されます。
Warning: Application delegate received call to -application:handleEventsForBackgroundURLSession:completionHandler: but the completion handler was never called.
ここにブレークポイントを設定しました。この時点で、メッセージはコンソールに既に表示されておりbackgroundCompletionHandler
、nil
.
Xcode 7.0 を使用して iOS 9 SDK に対してビルドしており、現在 Alamofire 2.0.2 を使用しています。
これは当初、Swift 2.0 ブランチをマージしたときに導入されたと思っていましたが、iOS 8 SDK に対して Xcode 6.4 を使用した以前のコミットのメッセージも表示されています。
更新 1
@cnoon の提案に対処するには:
- 識別子が一致します。構成とマネージャーはシングルトン内に設定されているため、間違っていることはありません。
didSet
クラスのonbackgroundCompletionHandler
内に追加して印刷すると、警告の前にManager
メッセージがログに記録されます。- クラス内で
sessionDidFinishEventsForBackgroundURLSession
on に設定されたクロージャの内部を出力すると、警告の後にメッセージが出力されます。delegate
Manager
sessionDidFinishEventsForBackgroundURLSession
を呼び出す前にその内部でオーバーライドして出力すると、警告の後backgroundCompletionHandler
にメッセージが出力されます。- Xcode プロジェクトがバックグラウンド セッション用に正しくセットアップされていることを確認する方法については、その方法がわかりません。また、その方法に関するドキュメントも見つかりませんでした。
携帯電話からいくつかのスクリーンショットをアップロードしようとしたときに、これらの提案を試すために最初にこの問題を再現できなかったことを覚えておく必要があります.
これを再現できるようになったのは、いくつかの写真を共有しようとした後でした。相関関係があるかどうかはわかりませんが、写真のアップロードに時間がかかることに関連している可能性があります.
更新 2
はUIBackgroundModes
@Nick が説明したとおりに設定されており、completionHandler()
内部で直接呼び出しapplication:handleEventsForBackgroundURLSession:completionHandler:
ても警告は表示されません。
アップデート 3
そのため、私は小さいながらも重要な詳細を見落としていたようです。Alamofire.Manager
それを直接公開しないラッパーがあります。その実装の関連部分は次のようになります。
private var manager: Manager
public var backgroundCompletionHandler: (() -> Void)? {
get {
return manager.backgroundCompletionHandler
}
set {
manager.backgroundCompletionHandler = backgroundCompletionHandler
}
}
AppDelegate
そのコードパスを実行する際に完了ハンドラを設定します。
func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
myManager.sharedInstance.backgroundCompletionHandler = completionHandler
}
Alamofire.Manager
のインスタンスを公開して直接アクセスする次の変更では、警告が生成されないことを確認しました。
public var manager: Manager
// public var backgroundCompletionHandler: (() -> Void)? {
// get {
// return manager.backgroundCompletionHandler
// }
// set {
// manager.backgroundCompletionHandler = backgroundCompletionHandler
// }
// }
とでAppDelegate
:
func application(application: UIApplication, handleEventsForBackgroundURLSession identifier: String, completionHandler: () -> Void) {
myManager.sharedInstance.manager.backgroundCompletionHandler = completionHandler
}
これに基づいて、計算されたプロパティを使用して完了ハンドラーをプロキシすることが問題の原因であると思われます。
このプロパティを公開したくないので、回避策や代替手段を知りたいです。