Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/43.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS-解锁后第一个网络请求失败_Ios_Iphone_Swift_Alamofire - Fatal编程技术网

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

iOS-解锁后第一个网络请求失败,ios,iphone,swift,alamofire,Ios,Iphone,Swift,Alamofire,我有一个iOS应用程序,可以在applicationIDbecomeactive中从服务器提取用户数据 如果用户按下home(主页)按钮,然后通过应用程序图标或多任务屏幕返回应用程序,则该功能工作正常 如果用户同时锁定设备(在应用程序中或按下home键,然后锁定),网络请求将失败。我用的是阿拉莫菲尔。响应对象为nil,结果。数据为空。服务器上也没有记录任何请求。失败会立即发生。说内核可以从应用程序下回收套接字,而不让他们知道会发生什么。以下是相关部分: 测试套接字回收 如果您要编写处理套接字资源

我有一个iOS应用程序,可以在
applicationIDbecomeactive
中从服务器提取用户数据

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

如果用户同时锁定设备(在应用程序中或按下home键,然后锁定),网络请求将失败。我用的是阿拉莫菲尔。响应对象为
nil
结果。数据为空。服务器上也没有记录任何请求。失败会立即发生。

说内核可以从应用程序下回收套接字,而不让他们知道会发生什么。以下是相关部分:

测试套接字回收

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

  • 将应用程序置于后台
  • 确保应用程序已挂起
  • 锁定屏幕
  • 当你的应用程序恢复执行时,它会发现它的套接字已被删除 被回收

    要解决此问题,请尝试在调用我的AppDelegate的应用程序WillEnterForeground时创建新的Alamofire.Manager。
    希望这能帮助您..

    在应用程序中将进入AppDelegate的前台,再次初始化网络管理器类,它将解决问题。出现此问题的原因是,当您锁定设备时,操作系统会锁定插座,当手机解锁时,操作系统不会释放插座。因此,请再次初始化网络管理器类,它将解决问题

         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
         }
    

    但我不会在后台运行任何东西。此网络请求是在
    ApplicationIDBecMeactive
    中发出的,因此我的应用程序肯定应该可以访问网络?我猜NSURLSession(Alamofire.Manager正在缓存)有一个或多个套接字保持打开(可能是为了避免重新协商TLS握手)。然后,当设备锁定时,操作系统会回收这些套接字。对它们的下一个请求将导致系统调用中的EBADF errno,该错误将被转换为带有本地化描述“connection closed”(连接已关闭)的NSError。您知道我如何解决这个问题吗?我试图找到某种刷新功能。我现在唯一想做的就是让请求重试我也有同样的问题,有什么想法吗`Alamofire.Manager()不起作用一个解决方案是每次应用程序从后台出现时都使用一个新的管理器,这对我很有效