簡體   English   中英

跟蹤iOS應用程序的任何用戶交互

[英]Track any user interaction of an iOS App

如何跟蹤或捕獲iOS應用程序的每個用戶交互? 就像按下一個UIButton,UIBarButton,...任何UIControl元素一樣。

我知道有數百種分析工具,例如Google Analytics(分析),Flurry,Appsee等,但我想將這些數據保存在自己的服務器上。

您好@tuvok,如果您不想使用Google Analytics(分析)和其他庫,則必須制作一個API(Web服務)。 您必須在每次用戶互動(例如按下按鈕或其他操作)時都點擊api。

您可以將UIApplication子類化:

  • 創建一個UIApplication子類
  • 覆蓋sendAction(_ action:Selector,以target:Any ?,從sender:Any ?,對於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參考, 請單擊此處

找到了一個簡單的解決方案:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM