提升iOS开发效率:如何正确使用日志、埋点和断言

引言

在iOS开发中,日志(Logging)、埋点(Event Tracking)和断言(Assertions)是开发者常用的三大利器。它们不仅能够帮助开发者高效调试代码,追踪用户行为,还能在开发过程中确保代码的正确性和稳定性。

本篇博客将详细介绍日志、埋点和断言在iOS开发中的使用场景和最佳实践,帮助你在实际开发中更好地选择和应用这些工具,提高开发效率和代码质量。

日志

主要用于记录应用运行时的信息,从简单的调试输出到复杂的错误追踪,日志在开发和生产环境中都扮演着重要角色。

通过合理地记录日志,开发者可以快速定位问题,分析应用性能,进而优化代码。

使用场景

我们在实际开发过程中几乎一直都在使用它,在各个方面它都发挥着重要作用:

  1. 调试:在开发过程过程中使用日志来进行代码调试。
  2. 错误追踪:在开发或生产过程中记录错误信息,便于排查问题。
  3. 性能分析:在开发过程中记录性能相关数据,帮助优化APP。

常用工具

通常我们会使用print直接打印日志,在OC中会使用NSLog打印,这样做没有问题,但是还有一些专门的第三方库可以指定日志等级,记录的内容也更全面。

比如SwiftyBeaver,CocoaLumberjack,OSLog。

已SwiftyBeaver为例,记录日志方法如下:

    @objc func doneButtonAction() {
        guard let title = inputField.text, !title.isEmpty else {
            LAToastHelper.makeToast(message: "请输入笔记本标题")
            LALogHelper.debug(module: "LABuildBookViewController", "请输入笔记本标题")
            return
        }
        let intro = introTextView.text ?? ""
        // 创建
        presenter.buildBook(title: title, introduce: intro, imageName: imageName) {[weak self] book in
            guard let self = self else { return }
            guard let book = book else {
                LAToastHelper.makeToast(message: "发生了一点错误,创建笔记本失败了!")
                LALogHelper.debug(module: "LABuildBookViewController", "创建笔记本失败")
                return
            }
            LAToastHelper.makeToast(message: "已经成功创建笔记本啦!\n快去写点东西吧!")
            LALogHelper.debug(module: "LABuildBookViewController", "创建笔记本成功")
            self.buildSuccess?(book)
            self.dismissDialog()
        }
    }

LALogHelper是对SwiftyBeaver的一层封装,代码中使用了SwiftyBeaver的debug等级的记录日志方式,只会在开发环境生效,这样减少了生产环境的不必要的日志存储。

日志获取

通常日志会记录在本地,我们可以指定日志的文件路径,以及大小。

SwiftyBeaver默认会将日志记录在Caches文件下,但是我们仍然可以自己来指定文件路径:

let log = SwiftyBeaver.self

// Create a file destination
let file = FileDestination()

// Set the log file path
if let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
    let customLogFileURL = documentsDirectory.appendingPathComponent("CustomLogs/customLogFile.log")
    file.logFileURL = customLogFileURL
}

// Add the destinations to SwiftyBeaver
log.addDestination(file)

如果是模拟器我们可以直接前往指定路径,而如果是真机的话我们需要借助xcode,点击菜单栏的window菜单下的Devices and Simulators

然后点击Download Container,下载下来后会是一个.xcappd文件。

.xcappdata 文件是 Xcode 中用来保存应用数据容器的包。这些文件可以包含应用的沙盒目录,包括 DocumentsLibrary 和 tmp 文件夹。

右击后点击显示包内容,找到你日志保存的路径即可,截图效果如下:

有些场景还可以在指定的条件下将日志文件直接上传云端,开发者可以从云端拉取日志用来分析问题。比如在进入用户反馈页面,或者通过长连接发送消息通知用户端自动上传。

埋点

埋点是指在应用程序的特定位置插入代码,用于捕捉和记录用户交互、应用事件和系统状态等信息。这些记录的数据通常会发送到服务器进行存储和分析。

目的

埋点的数据通常来讲对运营和数据分析团队作用更大一下,可以使用埋点数据分析用户行为,统计功能或页面的PV,UV,追踪用户流失原因,进行AB测试等等。

对于开发来说,埋点可以统计APP的性能比如加载时长,响应速度等等,也可以利用埋点来记录错误和异常情况。

类型

埋点又分为手动埋点和自动埋点两种类型。

  1. 手动埋点:需要开发者手动添加埋点,灵活性比较高,可以精准的控制埋点时机和记录数据,但是维护成本较高,几乎和开发代价相同。
  2. 自动埋点:使用三方工具库直接自动捕捉用户行为数据,通常会包括页面曝光,点击,APP启动时长等等。虽然实现简单但是灵活性较差。

实现

在iOS开发中,常用的埋点工具和库有很多,例如 Firebase Analytics、AppsFlyerLib、Segment 等。下面是一个使用 Firebase Analytics进行手动埋点的示例:

import Firebase

func trackButtonClick() {
    Analytics.logEvent("button_click", parameters: [
        "button_name": "example_button"
    ])
}

通过 Firebase 控制台查看和分析收集到的用户行为数据。

断言

它是一种用于验证程序假设的工具。在开发过程中,断言可以帮助开发者确保代码的正确性和健壮性。通过在关键位置使用断言,开发者能够及早发现潜在问题,避免代码进入无效状态。

使用场景

在开发阶段,当遇到一些预期之外的结果时,我们可以使用断言来进行验证。通过断言,我们可以确保程序在运行时符合预期的逻辑和状态,如果不符合预期,程序会立即中断并报告错误,这样有助于我们迅速发现和修复潜在问题。

例如在一个列表中,出现了未注册的数据类型:

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let model = dataSource[indexPath.row]
        if let reuseIdentifier = model.reuseIdentifier {
            let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath)
            cell.selectionStyle = .none
            return cell
        }
        
        CSAssert(false, "未知的cell类型")
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
        return cell
    }

其中CSAssert只是对assert的一层封装。

或者在处理复杂的数据结构时,用来验证数据是否符合预期,代码如下:

struct Person {
    let name: String
    let age: Int
}

func createPerson(name: String, age: Int) -> Person {
    assert(!name.isEmpty, "Name must not be empty")
    assert(age >= 0, "Age must be non-negative")
    return Person(name: name, age: age)
}

或者使用它放置程序进入无效的状态或错误状态:

func updateUI() {
    assert(Thread.isMainThread, "UI updates must be performed on the main thread")
    // 更新 UI
}

但需要注意,断言只会在开发和调试阶段来使用,并且避免大量触发断言,要在关键的地方合理使用,让它来帮助我们及早发现问题和修复潜在的问题,提高代码的健壮性和可靠性。

结语

在 iOS 开发中,日志、埋点和断言是三种强有力的工具,它们各自扮演着重要角色。

日志通过记录和追踪应用运行时的信息,帮助开发者调试和分析问题;

埋点通过收集用户行为数据,为产品优化和用户体验提升提供了宝贵的依据;

断言则通过验证代码假设,确保程序在开发阶段的正确性和稳定性。

通过合理地使用这三种工具,开发者可以显著提高开发效率,减少错误发生的概率,提升应用的质量和用户满意度。在日常开发中,我们应根据具体场景和需求,选择合适的工具进行应用,从而构建出更加可靠和高效的 iOS 应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值