2

我正在开发一个分析 SDK,它将跟踪所有用户事件,哪个视图出现或消失,单击哪个按钮,打开或关闭哪个 UISwitch,滚动 UITableView 或点击单元格等。

我正在使用方法调配来实现此功能,但我看到了一些与此相关的缺点

  1. 如果 swizzling 发生多次,您的代码将无法工作,或者 firebase(或任何其他使用相同方法的框架)将无法工作。

  2. 当更新的 iOS 版本发布时,swizzling 可能会失败。您可能必须每次都进行交叉检查。

我已经阅读了这篇文章的缺点

https://medium.com/@abhimuralidharan/method-swizzling-in-ios-swift-1f38edaf984f

这是我如何跟踪的示例代码 1. ViewDidAppeard 跟踪

@objc func viewDidDisappearOverride(_ animated: Bool) {

}

static func swizzleViewDidDisappear() {
    if self != UIViewController.self {
        return
    }
    let _: () = {
        let originalSelector = #selector(UIViewController.viewDidDisappear(_:))
        let swizzledSelector = #selector(UIViewController.viewDidDisappearOverride(_:))
        guard let originalMethod = class_getInstanceMethod(self, originalSelector),
            let swizzledMethod = class_getInstanceMethod(self, swizzledSelector) else { return }
        method_exchangeImplementations(originalMethod, swizzledMethod)
    }()

2.带有扩展UIButton的ButtonClick跟踪

override open func awakeFromNib() {
    super.awakeFromNib()
    self.addTarget(self, action: #selector(globalUIButonAction), for: .touchUpInside)
}

@objc func globalUIButonAction (_ sender: UIButton) { }

如何跟踪所有事件最好的方法或解决方案是什么?

4

1 回答 1

0

抱歉回复晚了,我发现自己处于同样的情况,我正在研究跟踪用户交互并记录它的库。

我继续处理 UIViewController 事件的方法,尤其是涵盖内部可交互组件的方法是划分 UIViewController 用例。

就我而言,大多数屏幕(UIViewControllers)都有:

  1. UIScrollView
  2. UITableView
  3. 不需要上面提到的两个直接添加的组件
  • 对于 (1 & 3),我不得不调配 UIViewConrtoller 的 viewDidAppear 方法,我确实意识到调配有缺点,但确实有一种方法可以获取之前注册的方法实现并使用它。这样我们就可以确保它运行良好,即使有其他一些 SDK,比如使用 swizzling 的 firebase 分析。此外,我通过访问子视图并为在遍历过程中发现的每个组件添加我自己的“目标操作”来遍历 UIViewController 视图,这些组件继承自 UIControl。

  • 对于 2,我只是对“UITableViewCell”使用了上述扩展技术,在“awakeFromNib”中,简单地在单元格上添加了一个触摸手势,并为内部的任何可交互组件(任何继承自UI 控制)。

PS:我知道有些组件不直接继承自 UIControl,我不得不单独覆盖它们,比如 UITextView。

我很想与您取得联系并分享我对该主题的见解。我目前在图书馆工作。随时联系我。

于 2020-11-03T06:03:52.020 回答