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

问题描述:

我正在使用Alamofire,并在模拟器上运行我的应用程序几个小时后,我得到了这个错误的崩溃。***由于未捕获的异常'NSGenericException'而终止应用程序,原因是:'开始日期不能晚于结束日期!'

***终止应用程序,由于未捕获的异常'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 

是否有人得到了类似的崩溃?

谢谢

+2

发表一些你正在处理的日期代码 – Vinodh

+0

是的,我用我的应用程序的一些日期,但我无法知道是什么原因这个崩溃,你可以在看日期堆栈跟踪。 – thierryb

+0

发布代码,您使用的日期和方式 – Vinodh

我有同样的崩溃和今天做了一些研究,发现这一点:

http://www.openradar.me/28301343

它看起来苹果解决了该问题在iOS的10.2。只是认为它可以帮助你!

+0

这是完美的。谢谢。 – thierryb

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

+0

似乎非常相似。谢谢! – thierryb

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

如果您使用的是Alamofire,并且您不需要NSURLSessionTaskMetrics,则可以解决这种通过使用自定义SessionDelegateSessionManager并重写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(如呼叫​​),你可以在代替为了使用您的自定义创建自己的SessionManager SessionDelegate

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

现在不是调用​​你会打电话sessionManager.request(...)

+0

嘿,你做了这个工作吗?不幸的是,这并没有解决它对我来说,停止崩溃的唯一方法是如果我进入SessionDelegate并删除didFinishCollecting方法,你有什么崩溃? – RicardoDuarte

+0

这对我很有用,应该和删除didFinishCollecting方法一样(不必修改Alamofire)。我得到/重现了与原始问题完全相同的崩溃。 您是否正在使用AlamofireImage,或者没有为您的所有请求使用此SessionDelegate? – stu

+0

是的,我仍然得到错误。我正在使用Alamofire,并且刚刚升级到XCode8.2,因为人们在这里提到它,所以我没有在10.2和10.1之间看到这个问题。 我已经添加了你的代码,并且tbh我同意你的代码应该工作,但是看起来URLSession正在以某种其他方式寻找指标方法。我仍然收到这个错误。我会做更多的调试,我会看看我可以找到解决这个问题的解决方案,而无需删除指标方法。 – RicardoDuarte

我一直在这个问题在过去几个月的OS X应用程序挣扎着已经找到了解决办法。

背景: 像OP使用Alamofire通过定时器请求JSON数据每秒多次发送请求。数据按预期发布,但是我收到与OP相同消息的不规则间隔的随机崩溃,即开始日期不能晚于结束日期!等等

解决方案: 不是以规则的间隔发送请求Alamofire我增加了一些逻辑,其检查所述先前请求的发送下一个前一个回报。这完全消除了随机崩溃。

希望它能帮助:)

@thierryb