如何在运行时将 iOS 中的设备日志捕获到 iPhone 的文档目录中的文件中?

How to capture Device Logs in iOS during Runtime into a file in Documents Directory from iPhone?

我的要求是在 iOS 中的应用程序运行期间将所有调试日志捕获到一个文件中。这样做的基本原因是为了了解我的应用程序在不同网络中 VOIP 呼叫的行为。我们想要了解 5G 网络中的呼叫行为,因为我们没有规定来测试 5G 网络中的行为。我们的 SDK 可以记录行为。我知道通过将开发设备连接到 Xcode 来捕获开发设备的日志,但我需要对生产中的设备执行相同的操作。我想提供一个选项,将这些日志邮寄到邮件 ID。有办法吗?任何帮助将不胜感激。

有几个选项可以从生产设备获取日志信息,但它们都有缺点。

1。系统诊断

用户必须手动触发系统诊断,然后在设置中导航到分析数据,找到相应的文件并以某种方式将其发送给您。它相当大(数百 MB),但您会在里面找到相应的 logarchive 并可以在控制台应用程序中打开它或使用 log 命令

2。等待 iOS 14(也许)

在macOS上,OSLog框架包含通过OSLogStore收集日志信息的手段;在 iOS 13 beta 中,这也可用,但最终已从最终版本中删除。也许Apple会把它放在下一个iOS

3。使用第三方工具

有几个第 3 方日志工具可用,看看 SwiftyBeaverSwiftLogCocoaLumberjack 或其他人。

4。自带

你也可以在你的应用程序中实现一些基本的日志记录,将信息写入文件,然后让用户通过电子邮件将其发送给你(或通过 https 传输,但我宁愿将此通知用户) .有趣的是,我正准备编写一些小帮手 类,因为我不想要所有这些 3rd-party-cloud-logging。像这样:

 
@IBAction func doAction(_ sender: Any) {
    pEnter(); defer { pLeave() }       
    // ...
    let dateString = " ... "
    traceError("Illegal init date: \(dateString)")
}

/* ... */

 
#if DEBUG
func pEnter(file: String = #file, line: Int = #line, function: String = #function) {
    FunctionCallTracker.instance.enter(file: file, line: line, function: function) 
}
func pLeave(file: String = #file, line: Int = #line, function: String = #function) {
    FunctionCallTracker.instance.leave(file: file, line: line, function: function) 
}
 
func traceError(_ text: @autoclosure @escaping()->String, 
                 error:Error? = nil, 
                 file: String = #file, 
                 function: String = #function,
                 line: Int = #line) {
    /* ... */
}
#else
@inline(__always) func traceFile(_ text: @autoclosure @escaping()->String) {}
@inline(__always) func pEnter() {}
@inline(__always) func pLeave() {}
#endif

如果你有兴趣,我可以在几周内完成后更新给你。