2

这是场景:

  • 具有后台配置的 NSURLSession
  • 下载或上传任务以 Bad or No Internet Connection 开始。
  • 用户关闭应用程序。
  • 如果 iOS 获得 Internet Connection 将启动会话任务。然而,
  • 任务仍在等待互联网。
  • 用户杀死应用程序
  • 系统取消所有待处理的任务

问题

当用户再次打开应用程序时,可以知道任务被取消了吗?

如果是,在哪里?


这个答案说是的,有可能,但我无法得到任何回调返回错误。

我正在使用 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
}()
4

1 回答 1

3

感谢Rob,因为他向我展示了正确的道路。

所以用户杀死应用程序后,系统会取消所有待处理的任务。


您可以通过 system.log 看到:

模拟器/调试/打开系统日志...

如何捕捉已经发生的事情?

再次实例化您的 Background NSURLSession。在其他地方做,但我将在 AppDelegate 中做这个例子。

系统知道(感谢标识符)它与之前的后台会话相同,因此它映射待处理的任务。

然后检索所有任务。取消的任务还在

这些任务将有一个您可以检查的错误。

Error Domain=NSURLErrorDomain Code=-999 "(null)" 
UserInfo={NSErrorFailingURLStringKey=http://your.api.com/url,     
NSURLErrorBackgroundTaskCancelledReasonKey=0,        
NSErrorFailingURLKey=http://your.api.com/url}

此外,通过任务,您将获得请求 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->操作被取消,因为用户强制应用退出。

所以我们走在正确的轨道上。如果有人有更好的解决方案,请分享!我不太喜欢我的请求网址的映射解决方案。

于 2016-11-15T18:15:00.923 回答