You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

iOS应用日志如何通过脚本自动采集?求可行解决方案

自动采集iOS应用日志到Mac的可行方案

手动采集日志确实效率太低了,尤其是跑UI Tests的时候,得盯着设备来回切换,太折腾人了。我之前帮不少开发者解决过类似的自动化日志采集问题,给你几个亲测有效的方案,你可以根据自己的需求选:

方案一:用Xcode命令行工具结合系统log命令

这个方案不需要额外装工具,用苹果自带的命令就能搞定,适合和UI Tests的自动化运行结合起来:

  • 先获取你的设备UDID:
    打开终端,运行xcrun instruments -s devices,找到你的测试设备,复制它的UDID。
  • 运行UI Tests并同时捕获日志到本地文件:
    把下面的命令里的参数换成你自己的项目信息,直接在终端执行或者写到shell脚本里:
    # 替换成你的UDID、项目路径、scheme名称、日志保存路径
    UDID="你的设备UDID"
    PROJECT_PATH="/Users/xxx/YourApp.xcodeproj"
    SCHEME_NAME="YourAppUITests"
    LOG_OUTPUT_PATH="/Users/xxx/uitests_logs.txt"
    
    # 启动UI Tests并同时捕获设备日志
    xcodebuild test -project "$PROJECT_PATH" -scheme "$SCHEME_NAME" -destination "id=$UDID" 2>&1 | tee "$LOG_OUTPUT_PATH"
    
    这个命令会把UI Tests的运行日志和设备上的应用日志都输出到指定的文本文件里,方便后续查看。

方案二:用libimobiledevice的idevicesyslog工具

如果需要更灵活的日志采集(比如不需要跑Tests的时候也能自动捞日志),可以装libimobiledevice这个开源工具,它能直接和iOS设备通信:

  • 安装libimobiledevice:
    用Homebrew安装的话,终端运行brew install libimobiledevice
  • 实时捕获并保存应用日志:
    如果你只想采集特定应用的日志,可以先获取应用的bundle ID,然后用下面的命令过滤并保存:
    # 替换成你的设备UDID和应用bundle ID
    UDID="你的设备UDID"
    BUNDLE_ID="com.yourcompany.yourapp"
    LOG_OUTPUT_PATH="/Users/xxx/app_logs.txt"
    
    # 过滤指定应用的日志并保存到文件
    idevicesyslog -u "$UDID" | grep "$BUNDLE_ID" > "$LOG_OUTPUT_PATH"
    
    要是需要在UI Tests开始前自动启动日志采集,你可以写个shell脚本,先启动这个日志命令,再跑xcodebuild的测试命令,测试结束后终止日志进程。

方案三:在UI Tests代码中集成日志收集

如果希望日志和UI Tests的步骤关联更紧密,可以在UI Tests代码里直接收集应用的日志,然后输出到本地:
比如在Swift的UI Tests里,你可以添加这样的代码:

import XCTest

class YourAppUITests: XCTestCase {
    var app: XCUIApplication!
    var logFileHandle: FileHandle?

    override func setUpWithError() throws {
        continueAfterFailure = false
        app = XCUIApplication()
        
        // 初始化日志文件
        let logPath = "/Users/xxx/uitests_detailed_logs.txt"
        FileManager.default.createFile(atPath: logPath, contents: nil)
        logFileHandle = FileHandle(forWritingAtPath: logPath)
        
        // 启动应用前先清空日志(可选)
        try app.terminate()
    }

    override func tearDownWithError() throws {
        logFileHandle?.closeFile()
        try app.terminate()
    }

    func testExample() throws {
        app.launch()
        
        // 采集应用日志并写入文件
        let syslog = XCUIApplication().systemLog
        if let logData = syslog.data(using: .utf8) {
            logFileHandle?.write(logData)
        }
        
        // 你的UI Tests步骤...
    }
}

这个方法能把日志和测试步骤绑定,方便定位哪个测试步骤出了问题。

另外,之前你试的cfgutil其实更适合批量管理设备,Apple Script对设备日志的支持确实有限,上面这几个方案应该能解决你的问题,你可以先试试方案一,因为不需要额外装工具,上手最快。

内容的提问来源于stack exchange,提问作者user2606782

火山引擎 最新活动