***由于未捕获的异常'NSGenericException'而终止应用程序,原因是:'开始日期不能晚于结束日期!'

时间:2016-11-21 15:25:52

标签: ios alamofire cfnetwork

我正在使用Alamofire,在我的应用程序在模拟器上运行几个小时之后,我遇到了这个错误的崩溃。

  

***因未捕获的异常'NSGenericException'而终止应用程序,原因是:'开始日期不能晚于结束日期!'

我在控制台中获得了这个堆栈跟踪:

*** First throw call stack:
(
    0   CoreFoundation                      0x0000000111186d4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x0000000110be821e objc_exception_throw + 48
    2   Foundation                          0x00000001107f0e3c -[_NSConcreteDateInterval dealloc] + 0
    3   CFNetwork                           0x00000001131a18e8 -[__NSCFURLSessionTaskMetrics _initWithTask:] + 868
    4   CFNetwork                           0x00000001131a1497 -[NSURLSessionTaskMetrics _initWithTask:] + 100
    5   CFNetwork                           0x0000000112f77bc7 -[__NSCFURLLocalSessionConnection _tick_finishing] + 351
    6   libdispatch.dylib                   0x00000001128e3978 _dispatch_call_block_and_release + 12
    7   libdispatch.dylib                   0x000000011290d0cd _dispatch_client_callout + 8
    8   libdispatch.dylib                   0x00000001128eae17 _dispatch_queue_serial_drain + 236
    9   libdispatch.dylib                   0x00000001128ebb4b _dispatch_queue_invoke + 1073
    10  libdispatch.dylib                   0x00000001128ee385 _dispatch_root_queue_drain + 720
    11  libdispatch.dylib                   0x00000001128ee059 _dispatch_worker_thread3 + 123
    12  libsystem_pthread.dylib             0x0000000112cbc736 _pthread_wqthread + 1299
    13  libsystem_pthread.dylib             0x0000000112cbc211 start_wqthread + 13
)
libc++abi.dylib: terminating with uncaught exception of type NSException

有人遇到了类似的崩溃吗?

谢谢

4 个答案:

答案 0 :(得分:2)

是的,我刚刚遇到了同样的崩溃。它发生在后台线程中,它似乎与发出URL会话网络请求有关。我想知道是否有某种多线程错误与我同时发出两个网络请求这一事实有关。我也使用Alamofire,但不确定这个错误是在Alamofire还是在Apple的代码中。我现在还无法复制它。也许你可以弄清楚如何重现它,然后在Apple的bug雷达或Alamofire GitHub回购中提出问题。

答案 1 :(得分:2)

我遇到了同样的崩溃,今天做了一些研究,发现了这个:

http://www.openradar.me/28301343

看起来Apple修复了iOS 10.2中的问题。只是觉得它可以帮到你!

答案 2 :(得分:1)

这是Apple的NSURLSessionTaskMetrics代码中的一个错误,当用户的时钟向后移动得足够远以至于请求开始时间戳位于请求结束时间戳之后时,会发生网络请求。这可以使用网络调试代理和手动调整时钟重现,并且只发生在iOS 10.0到iOS 10.2之间

如果您使用的是Alamofire,并且不需要NSURLSessionTaskMetrics,则可以通过为SessionDelegate使用自定义SessionManager并覆盖responds(to aSelector..)来解决此问题。功能例如:

class MySessionDelegate: Alamofire.SessionDelegate {
    override public func responds(to aSelector: Selector) -> Bool {
        let result: Bool = super.responds(to: aSelector)
        if #available(iOS 10.2, *) {
            // NSURLSessionTaskMetrics date crash is fixed
            return result
        } else if #available(iOS 10.0, *) {
            // NSURLSessionTaskMetrics date crash is not fixed, turn off metric collection
            if aSelector ==  #selector(self.urlSession(_:task:didFinishCollecting:)) {
                return false
            } else {
                return result
            }
        } else {
            // NSURLSessionTaskMetrics doesn't exist
            return result
        }
    }
}

如果您使用的是默认SessionManager(例如调用Alamofire.request(...)),则可以创建自己的SessionManager,以便使用自定义SessionDelegate

let sessionManager: Alamofire.SessionManager = {
    let configuration: URLSessionConfiguration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = SessionManager.defaultHTTPHeaders
    return Alamofire.SessionManager(configuration: configuration, delegate: MySessionDelegate(), serverTrustPolicyManager: nil)
}()

而不是致电Alamofire.request(...),而是致电sessionManager.request(...)

答案 3 :(得分:0)

在过去的几个月里,我一直在使用os x应用程序解决这个问题并找到了解决方法。

<强>背景 就像OP使用Alamofire通过Timer请求JSON数据每秒多次发送请求一样。数据以预期的方式进入但是我以不规则的间隔随机崩溃,并且与OP相同的消息,即开始日期不能晚于结束日期!等等。

<强>解决方案: 我不是定期发送Alamofire请求,而是添加了一些逻辑,在发送下一个请求之前检查先前请求的返回。这完全消除了随机崩溃。

希望有所帮助:)

@thierryb