iOS - 解锁后首次网络请求失败

问题描述 投票:0回答:3

我有一个 iOS 应用程序,可以从

applicationDidBecomeActive
中的服务器提取用户数据。

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

如果用户同时锁定设备(无论是仍在应用程序中还是按 Home 键,然后锁定),网络请求都会失败。我正在使用阿拉莫菲尔。响应对象是

nil
并且
result.data
是空的。服务器上也没有记录任何请求。故障立即发生。

ios iphone swift alamofire
3个回答
7
投票

Apple 技术说明 TN2277 表示,内核可以从应用程序下回收套接字,而他们不知道会发生什么。这是相关部分:

测试套接字回收

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

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

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

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


2
投票

在 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
     }

0
投票

即使不使用 Almofire,我也遇到了类似的问题。解锁后的第一个请求有时会出现错误 -1005

NSURLErrorNetworkConnectionLost
(某些用户 -1001
NSURLErrorTimedOut
)。

在日志中我可以看到:

[connection] nw_read_request_report [C1] Receive failed with error "Software caused connection abort"

对我来说,解决方案是等到应用程序处于活动状态(

applicationDidBecomeActive
通知)。我从
Timer
开始请求,但计时器不在后台运行,并且在应用程序再次运行后,甚至在
willEnterForeground
通知之前,挂起的计时器很快就会被触发。

推迟网络调用后,我仍然可以在日志中看到以下错误:

[connection] nw_flow_add_write_request [C1 A.B.C.D:443 failed parent-flow (satisfied (Path is satisfied), interface: en0[802.11], ipv4, dns)] cannot accept write requests
[connection] nw_write_request_report [C1] Send failed with error "Socket is not connected"

但是这些并没有破坏我的代码。

© www.soinside.com 2019 - 2024. All rights reserved.