更新为Xcode 9后,使用Swift 3和iPhone X模拟器时,我的控制台充满了以下内容:
TIC Read Status [11:0x0]: 1:57
TIC Read Status [11:0x0]: 1:57
TIC Read Status [11:0x0]: 1:57
...
那是什么,我该如何修复它?非常感谢您的帮助。
附注:我不想仅通过在构建方案中使用“环境变量”来“消音”它。
更新为Xcode 9后,使用Swift 3和iPhone X模拟器时,我的控制台充满了以下内容:
TIC Read Status [11:0x0]: 1:57
TIC Read Status [11:0x0]: 1:57
TIC Read Status [11:0x0]: 1:57
...
那是什么,我该如何修复它?非常感谢您的帮助。
附注:我不想仅通过在构建方案中使用“环境变量”来“消音”它。
苹果员工给出了以下答案:
TIC
是 “TCP I/O connection” 的缩写,是 CFNetwork 中的一个子系统,用于运行 TCP 连接
1
和 57
是 CFStreamError 域和代码,分别表示域为 1 的 kCFStreamErrorDomainPOSIX,而在该域中,57
表示 ENOTCONN
简而言之,TCP 读取失败并显示 ENOTCONN。
由于 TCP I/O 连接子系统没有公共 API,因此您必须通过一些高级封装器(如NSURLSession)使用它。
来源: https://forums.developer.apple.com/thread/66058
编辑/更新:
由于我们仍然有这些烦人的日志记录,我向上面链接中的同一位苹果专家询问了我们的情况,现在已经特定于 Xcode 9 和 Swift 4。下面是他的回答:
许多人抱怨这些日志,自从我升级到Xcode 9 / iOS 11以来,我所有的应用程序都有这些日志。
2017-10-24 15:26:49.120556-0300 MyApp[1092:314222] TIC Read Status [55:0x0]: 1:57
2017-10-24 15:26:49.120668-0300 MyApp[1092:314222] TIC Read Status [55:0x0]: 1:57
2017-10-24 15:26:49.626199-0300 MyApp[1092:314617] TIC Read Status [56:0x0]: 1:57
他的回答:
需要认识到,这个 ENOTCONN 并不一定意味着出现了问题。在所有版本的HTTP中,关闭的TCP连接都是预期的。因此,除非与此错误有其他症状相关联,否则我的建议是忽略它。
来源:https://forums.developer.apple.com/message/272678#272678
解决方案:只需等待Xcode 9的更新版本即可。
OS_ACTIVITY_MODE = disable
来忽略所有奇怪的系统控制台输出。链接:https://forums.developer.apple.com/thread/51196#thread-message-182684 - AverageHelper以下是 TIC Read Status [11:0x0]: 1:57
的详细信息:
TIC
表示“TCP I/O connection”,是 CFNetwork 中运行 TCP 连接的子系统。
11
是 TIC 内部的连接 ID 编号。
0x0
是指向 TIC 对象本身的指针。
1
和 57
分别是 CFStreamError 的域和代码;域为 1 表示 kCFStreamErrorDomainPOSIX,在这个域内,57 表示 ENOTCONN 错误。
libc++abi.dylib: terminating with uncaught exception of type NSException
。OS_ACTIVITY_MODE = disable
环境变量以避免控制台被此类警告淹没。针对这种类似日志消息以及其他(例如不一定是错误的NSURLSession错误)问题,我发现最好的方法是使用自己的日志函数。
class Logger {
static var project: String = "MyProject"
static func log(_ string: String, label: String = "") {
DispatchQueue.main.async {
print("[\(Logger.project)] \(label) : \(string)")
}
}
static func info(_ string: String) {
Logger.log(string)
}
static func warning(_ string: String) {
Logger.log(string, label: "WARNING")
}
static func error(_ string: String) {
Logger.log(string, label: "ERROR")
}
}
然后我只需在控制台底部的过滤器中输入[MyProject],就完成了。
请注意,通过在主队列上调用print,可以使您的记录器在不混淆控制台的情况下从线程中使用。
准备好根据您的需求进行改进和调整 :)
URLCache.shared.removeCachedResponse(for: request as URLRequest)
在进行URL请求后,当我收到响应后重置我的URLSession对象:
session.reset(completionHandler: {
// print(\(data))
})
问题已解决。
这是一个日志,表示TCP连接丢失/关闭/无效或其他情况。如果您的应用程序有一个运行中的tcp连接,并且该应用程序在一段时间内被放置在后台,或者您关闭了手机屏幕,这可能会发生。操作系统决定尽可能停止资源以减少电池耗电量。如果您将应用程序带到前台,则之前的tcp连接将不再起作用。您需要创建一个新的tcp连接。
如果它不影响您,请忽略它。