iOS - 解锁后第一个网络请求失败

时间:2016-03-09 20:05:10

标签: ios iphone swift alamofire

我有一个iOS应用程序,用于从applicationDidBecomeActive中的服务器提取用户数据。

如果用户按下主页按钮,然后通过应用程序图标或多任务屏幕返回应用程序,则该功能正常。

如果用户同时锁定设备(仍然在应用程序中或按下主页,然后锁定),网络请求将失败。我正在使用Alamofire。响应对象为nilresult.data为空。服务器上也没有记录请求。失败立即发生。

2 个答案:

答案 0 :(得分:4)

this SO answer,说内核可以从应用程序中回收套接字而不知道会发生什么。这是相关部分:

  

测试套接字回收

     

如果您要编写处理套接字资源的代码   由内核回收,你必须弄清楚如何测试它。该   系统可能回收套接字的确切情况   资源是故意没有记录的;这给了我们灵活性   改善未来的事物。但是,在当前系统上(iOS 4.0   通过iOS 4.3),您可以让系统从中回收资源   您的应用中的套接字:

     
      
  1. 将您的应用置于后台
  2.   
  3. 确保应用已暂停
  4.   
  5. 锁定屏幕
  6.         

    当您的应用程序恢复执行时,它会发现它的套接字有   被收回了。

要解决此问题,请在调用AppDelegate的applicationWillEnterForeground时尝试创建新的Alamofire.Manager。 希望这可以帮助你..

答案 1 :(得分:0)

在AppDelegate的applicationWillEnterForeground中,再次初始化您的Network Manager类,它将解决该问题。出现此问题的原因是,当您锁定设备时,操作系统会锁定插槽,并且在解锁手机时不会释放它。因此,请再次初始化您的网络管理员类,它将解决此问题。

     func applicationWillEnterForeground(_ application: UIApplication) {
            WebServiceManager.sharedInstance.sessionManr = Alamofire.SessionManager.default
            WebServiceManager.sharedInstance.sessionManr.session.configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData

            WebServiceManager.sharedInstance.sessionManr.session.configuration.urlCache = nil
            WebServiceManager.sharedInstance.sessionManr.session.configuration.timeoutIntervalForRequest =  180 //40
            WebServiceManager.sharedInstance.sessionManr.session.configuration.httpShouldSetCookies = true
     }