具有后台配置和应用程序的NSURLSession被用户

时间:2016-11-15 15:21:53

标签: ios swift alamofire nsurlsession nsurlerrordomain

这是一个场景:

  • NSURLSession with background Configuration
  • 下载或上传任务以错误或无互联网连接开始。
  • 用户关闭App。
  • 如果iOS获取Internet连接将会出现会话任务。然而,
  • 任务仍在等待互联网。
  • 用户杀死了应用
  • 系统取消所有待处理任务

问题

可以知道用户何时再次打开应用程序以取消任务?

如果是,在哪里?

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
}()

1 个答案:

答案 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 - > 操作已取消,因为用户强制该应用退出。

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