IOS11/Xcode 9中的 TIC 读取状态1:57是什么?

在使用 Swift 3和 iPhone X 模拟器升级到 Xcode 9之后,我的控制台充满了:

TIC Read Status [11:0x0]: 1:57
TIC Read Status [11:0x0]: 1:57
TIC Read Status [11:0x0]: 1:57
...

那是什么? 我该怎么办? 非常感谢你的帮助。

PS: 我不喜欢只是在构建方案中使用 Environment Variable“沉默”它。

59858 次浏览

以下是 TIC Read Status [11:0x0]: 1:57的分解过程:

TIC扩展为“ TCP I/O 连接”,这是 CFNetwork 中运行 TCP 连接的子系统

11是 TIC 中的连接 ID 号

0x0是指向 TIC 对象本身的指针

157分别是 CFStreamError 域和代码; 1的域是 kCFStreamErrorDomainPOSIX,在该域中,57是 ENOTCONN

资料来源: https://forums.developer.apple.com/thread/66058

苹果员工的回答如下:

TIC扩展为“ TCP I/O 连接”,这是 CFNetwork 中运行 TCP 连接的子系统

157分别是 CFStreamError 域和代码; 1的域是 kCFStreamErrorDomainPOSIX,在该域中,57是 ENOTCONN

简而言之,ENOTCONN 的 TCP 读操作失败。

由于 TCP I/O 连接子系统没有公共 API,因此必须通过某种高级包装器(如 NSULSession)使用它。

来源: 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的更新版本/更新。

注意: 就像@David 在评论中提到的那样,这是一种隐藏警告的方法,所以使用这个启动参数可以避免获得许多重复的消息,并且拥有一个干净的控制台。一旦完成调试,将其禁用,因为启用控制台时控制台不会提供有用的信息。例如 libc++abi.dylib: terminating with uncaught exception of type NSException

对于那些想知道如何消除警告的人,在有更好的解决方案之前,你可以保持跟随变量,并根据需要进行切换。

在产品方案的 Arguments 下使用 OS_ACTIVITY_MODE = disable环境变量,以避免控制台充斥此类警告。

注意 B: 让它看到效果。

资料来源: https://medium.com/@adinugroho/disable-os-logging-in-xcode-8-ec6d38502532

enter image description here

我发现,关于这个日志消息和其他一些错误(比如不一定是错误的 NSULSession 错误) ,最好的方法是使用我自己的日志函数。

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,可以从线程使用日志记录器,而不会混淆控制台。

准备好为你的需要而改进和调整:)

当时我遇到了同样的问题,在响应 REST (GET)服务时我得到了“}”。

使用:

URLCache.shared.removeCachedResponse(for: request as URLRequest)

在发出 URL 请求后,并在得到响应后重置 URLSession 对象,如下所示:

session.reset(completionHandler: {
// print(\(data))
})

解决了我的问题。

我们设法通过在 Web 服务器上禁用 HTTP/2来解决这个日志记录问题,在我们的案例中,我们已经从传统的 ELB 迁移到了在 AWS 上增加对 HTTP/2支持的应用程序 ELB,并且我们开始在 XCode 10.1/iOS 12控制台上获得“ TIC 读状态[11:0 x0] : 1:57”。这看起来像是一个临时的解决方案,直到苹果用 HTTP/2修复了这个问题(如果有的话)。这个解决方案可能不适用于所有人,特别是如果您使用的是第三方 API,但是它可以为您提供一些关于这个问题的见解。

它是一个日志记录,指示 TCP 连接丢失/关闭/无效或其他情况。如果您的应用程序有一个正在运行的 tcp 连接,并且该应用程序被放在后台一段时间,或者您关闭了手机屏幕,就会发生这种情况。操作系统决定停止尽可能多的资源,以减少电池排水。如果你把应用程序带到前台,你以前的 tcp 连接将不再工作。您需要重新创建一个新的 tcp 连接。

如果你不介意,就忽略它。