【问题标题】:Track any user interaction of an iOS App跟踪 iOS 应用程序的任何用户交互
【发布时间】:2017-11-21 12:34:22
【问题描述】:

如何跟踪或捕捉我的 iOS 应用的每次用户交互?就像按下 UIButton、UIBarButton、...任何 UIControl 元素一样。

我知道有数百种分析工具,例如 Google Analytics、Flurry、Appsee 等,但我想将这些数据保存在我自己的服务器上。

【问题讨论】:

  • 您可以在单个文本文件中编写每个操作!将该文件保存在文档目录中。然后在每次应用启动时将文件发送到您的服务器(使用 API)!

标签: ios swift analytics interaction


【解决方案1】:

您好@tuvok,如果您不想使用 Google 分析和其他库,那么您必须创建一个 API(Web 服务)。您必须在每次用户交互时点击 api,例如按下按钮或其他任何操作。

【讨论】:

    【解决方案2】:

    你可以继承 UIApplication:

    • 创建 UIApplication 子类
    • 覆盖 sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) 事件方法,记得调用超级实现
    • 在实现中放入 NSLog 或其他诊断代码

    例如,每次按下 UIButton 时都会打印一个日志:

    func sendAction(_ action: Selector, to target: Any?, from sender: Any?, for event: UIEvent?) -> Bool {
        if (sender is UIButton) {
            print("Action: \(NSStringFromSelector(action)) - \(target) - \(sender)")
        }
        return super.sendAction(action, to: target, from: sender, for: event)
    }
    
    
    2017-07-08 14:46:18.270 UIApplicationSubclass[94764:c07] Action: anAction: - <ViewController: 0x76790a0> - <UIRoundedRectButton: 0x767b9b0; frame = (103 66; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x767bad0>>
    2017-07-08 14:46:27.378 UIApplicationSubclass[94764:c07] Action: anAction: - <ViewController: 0x76790a0> - <UIRoundedRectButton: 0x767b9b0; frame = (103 66; 73 44); opaque = NO; autoresize = TM+BM; layer = <CALayer: 0x767bad0>>
    

    Objective-c 参考click here

    【讨论】:

      【解决方案3】:

      找到了一个简单的解决方案:

      1 .创建一个 UIControl 扩展

      private let swizzling: (AnyClass, Selector, Selector) -> () = { forClass, originalSelector, swizzledSelector in
          let originalMethod = class_getInstanceMethod(forClass, originalSelector)
          let swizzledMethod = class_getInstanceMethod(forClass, swizzledSelector)
          method_exchangeImplementations(originalMethod!, swizzledMethod!)
      }
      
      extension UIControl {
      
          static let classInit: Void = {
              let originalSelector = #selector(sendAction(_:to:for:))
              let swizzledSelector = #selector(swizzled_sendAction(_:to:for:))
              swizzling(UIControl.self, originalSelector, swizzledSelector)
          }()
      
          @objc func swizzled_sendAction(_ action: Selector, to target: Any?, for event: UIEvent?) {
      
              swizzled_sendAction(action, to: target, for: event)
              print("action was triggered")
          }
      }
      
      1. 在 AppDelegate 中初始化:

        @UIApplicationMain 类 AppDelegate: UIResponder, UIApplicationDelegate {

        override init() {
            super.init()
            UIControl.classInit
        }
        

      此处的示例:https://stackoverflow.com/a/42047289/2820043

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-17
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 2015-04-25
        • 1970-01-01
        • 2011-10-15
        • 1970-01-01
        相关资源
        最近更新 更多