这是一个场景:
问题
可以知道用户何时再次打开应用程序以取消任务?
如果是,在哪里?
This Answer说是的,这是可能的,但我无法回复任何错误。
我正在使用Alamofire处理我的所有网络电话。但是,我怀疑Alamofire会改变这种行为。
修改1
/// Networking manager with Background Session Configuration
static var backgroundManager: Alamofire.Manager = {
let configuration = NSURLSessionConfiguration.backgroundSessionConfigurationWithIdentifier("com.xxx.NetworkingManager.Identifier")
configuration.HTTPAdditionalHeaders = Manager.defaultHTTPHeaders
let backgroundManager = Alamofire.Manager(configuration: configuration)
return backgroundManager
}()
答案 0 :(得分:2)
向Rob致敬,因为他向我展示了正确的道路。
因此,在用户杀死应用程序后,系统会取消所有待处理的任务。
您可以使用system.log查看:
模拟器/调试/开放系统日志......
如何捕捉已经在进行的活动?
再次实例化您的背景NSURLSession
。在其他地方做,但我会在AppDelegate中为此示例执行此操作。
系统知道(由于标识符)它与之前相同的后台会话,因此它映射了挂起的任务。
然后检索所有任务。取消的任务仍在那里
任务将出现您可以检查的错误。
Error Domain=NSURLErrorDomain Code=-999 "(null)"
UserInfo={NSErrorFailingURLStringKey=http://your.api.com/url,
NSURLErrorBackgroundTaskCancelledReasonKey=0,
NSErrorFailingURLKey=http://your.api.com/url}
此外,通过这些任务,您将获得请求网址,以便您可以映射应用请求并执行某些操作。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// This is the code for Swift 2.x. In Swift 3.x this call is a bit different.
NetworkingManager.backgroundManager.session.getTasksWithCompletionHandler { (data, upload, download) in
for task in data {
NSLog("\(task.error)")
}
for task in upload {
NSLog("\(task.error)")
}
for task in download {
NSLog("\(task.error)")
let reason = task.error?.userInfo[NSURLErrorBackgroundTaskCancelledReasonKey] as? Int
let code = task.error?.code
if reason == NSURLErrorCancelledReasonUserForceQuitApplication &&
code == NSURLErrorCancelled {
NSLog("\(task.originalRequest)")
NSLog("\(task.currentRequest?.URL)")
}
}
}
}
NSURLErrorCancelledReasonUserForceQuitApplication
- > 操作已取消,因为用户强制该应用退出。
所以我们走在正确的轨道上。 如果有人有更好的解决方案,请分享!我真的不喜欢我的请求网址的映射解决方案。