我们的应用程序中有一个奇怪的错误,到目前为止只有一个用户遇到过(成千上万)我无法弄清楚如何解决这个问题,所以也许你可以帮助我进一步。
关于以下崩溃(运行时):
#0. Crashed: com.apple.main-thread
0 libswiftFoundation.dylib 0x10e51ec _TZFV10Foundation4Date36_unconditionallyBridgeFromObjectiveCfGSqCSo6NSDate_S0_ + 68
1 XXX 0x14d804 specialized static Loader._save(NSDictionary, Double, moc : NSManagedObjectContext) -> () (Loader.swift:149)
2 XXX 0x14d804 specialized static Loader._save(NSDictionary, Double, moc : NSManagedObjectContext) -> () (Loader.swift:149)
3 XXX 0x14286c static Loader.(registerUser(NSManagedObjectContext) -> ()).(closure #1) (Loader.swift)
4 Alamofire 0x5aea58 specialized DataRequest.(response<A where ...> (queue : DispatchQueue?, responseSerializer : A, completionHandler : (DataResponse<A.SerializedObject>) -> ()) -> Self).(closure #1).(closure #1) (ResponseSerialization.swift)
5 libdispatch.dylib 0x1b911797 _dispatch_call_block_and_release + 10
6 libdispatch.dylib 0x1b911783 _dispatch_client_callout + 22
7 libdispatch.dylib 0x1b915d05 _dispatch_main_queue_callback_4CF + 902
8 CoreFoundation 0x1c1ffd69 __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 8
9 CoreFoundation 0x1c1fde19 __CFRunLoopRun + 848
10 CoreFoundation 0x1c1510ef CFRunLoopRunSpecific + 470
11 CoreFoundation 0x1c150f11 CFRunLoopRunInMode + 104
12 GraphicsServices 0x1d8fbb41 GSEventRunModal + 80
13 UIKit 0x214d5e83 UIApplicationMain + 150
14 XXX 0xb7b1c main (AppDelegate.swift:26)
15 libdyld.dylib 0x1b93e4eb start + 2
Loader.swift第149行是:
let createDate : Foundation.Date = dateFormatter.date(from: eventCreated)!
看起来它是libswiftFoundation.dylib中的内部问题。 我对这个问题进行了很多研究,我唯一能找到的就是Apple:
SDK中的某些Objective-C方法可能会错误地注释或假设某种类型是非空的而不是可空的。 Swift视为结构的类型,例如NSURL(Foundation.URL)或NSDate(Foundation.Date),会导致名称类似bridgeFromObjectiveC的方法中的运行时崩溃;在其他情况下,它可能导致用户代码中的崩溃或未定义的行为。如果您确定了这种方法,请在bugreport.apple.com上提交报告。作为一种解决方法,在Objective-C中添加一个带有正确的可空性注释的trampoline函数。例如,以下函数将允许您使用接受nil URL的错误处理程序调用FileManager&#39; senumerator(at:includesPropertiesForKeys:options:errorHandler :)方法: https://developer.apple.com/library/content/releasenotes/DeveloperTools/RN-Xcode/Chapters/Introduction.html(根据已知问题)
示例如下:
static inline NSDirectoryEnumerator<NSURL *> * _Nullable
fileManagerEnumeratorAtURL(NSFileManager *fileManager, NSURL * _Nonnull url, NSArray<NSURLResourceKey> * _Nullable keys, NSDirectoryEnumerationOptions options, BOOL (^ _Nullable errorHandler)(NSURL * _Nullable errorURL, NSError * _Nonnull error)) {
return [fileManager enumeratorAtURL:url includingPropertiesForKeys:keys options:options errorHandler:^(NSURL * _Nonnull errorURL, NSError * _Nonnull error) {
return errorHandler(errorURL, error);
}];
}
我已经提交了针对此问题的错误报告,但仍未得到Apple的回复(7天后)。我认为这可以解决问题,但我不确定如何将给定的trampoline函数(示例)移植到有效/工作的NSDate / DateFormatter版本。有人知道更多这个问题和/或解决了吗?