iOS全埋點解決方案-手勢採集

来源:https://www.cnblogs.com/r360/archive/2022/04/21/16172988.html
-Advertisement-
Play Games

前言 ​ 隨著科技以及業務的發展,手勢的應用也越來越普及,因此對於數據採集,我們要考慮如果通過全埋點來實現手勢的採集。 一、手勢識別器 ​ 蘋果為了降低開發者在手勢事件處理方面的開發難度,定義了一個抽象類 UIGestureRecognizer 來協助開發者。UIGestureRecognizer ...


前言

​ 隨著科技以及業務的發展,手勢的應用也越來越普及,因此對於數據採集,我們要考慮如果通過全埋點來實現手勢的採集。

一、手勢識別器

​ 蘋果為了降低開發者在手勢事件處理方面的開發難度,定義了一個抽象類 UIGestureRecognizer 來協助開發者。UIGestureRecognizer 是具體手勢識別器的抽象基類,它定義了一組可以為所有具體手勢識別器配置的常見行為。它還可以通過設置委托(即實現了 UIGestureRecognizerDelegate 協議的對象),來支持對某些行為進行更細粒度的定製。

​ 手勢識別器必須被添加在一個特定的視圖上(比如 UILabel、UIImageView 等控制項),即需要通過調用 UIView 類中的 - addGestureRecognizer: 方法進行添加。手勢識別器也是用了 Target-Action 設計模式。當我們為一個手勢識別器添加一個或者多個 Target-Action 後,在視圖上進行觸摸操作時,一旦系統識別了該手勢,就會向所有的 Target 對象發送消息,並執行 Action 方法。雖然手勢識別器和 UIControl 類一樣,都是使用了 Target-Action 設計模式,但是手勢識別器並不會將消息交由 UIApplication 對象來進行發送。因此,我們無法使用與 UIControl 控制項相同的處理方式,即通過響應者鏈的方式來實現對手勢操作的全埋點。

​ 由於 UIGestureRecognizer 是一個抽象基類,所以它並不會處理具體的手勢。因此,對於輕拍(UITapGestureRecognizer)、長按(UILongPressGestureRecognizer)等具體的手勢觸摸事件,需要使用相應的子類即具體的手勢識別器進行處理。

常見的具體手勢識別器有:

  • UITapGestureRecognizer:輕拍手勢
  • UILongPressGestureRecognizer:長按手勢
  • UIPinchGestureRecognizer:捏合(縮放)手勢
  • UIRotationGestureRecognizer:旋轉手勢
  • UISwipeGestureRecognizer:輕掃手勢
  • UIPanGestureRecognizer:平移手勢
  • UIScreenEdgePanGestureRecognizer:屏幕邊緣平移手勢

​ 給上面所有的具體手勢識別器添加 Target-Action 的方法都是相同的,常見的主要是通過以下的兩個方法進行添加。

  • initWithTarget:target action:

  • addTarget:action:

    詳細的定義參考如下:

    /**
    指定初始化方法
    
    通過添加一個 Target-Action 進行初始化,
    當初始化的手勢識別器對象,識別到觸摸手勢時,會向 Target 對象發送消息,即調用 Action 方法
    
    @param target 需要發送消息的 Target 對象
    @param action 向 Target 對象發送的消息,即方法名
    @return 初始化的對象
    */
    - (instancetype)initWithTarget:(nullable id)target action:(nullable SEL)action NS_DESIGNATED_INITIALIZER;
    
    /**
    向一個手勢識別器添加一個 Target-Action
    
    可以多次調用此方法,給一個手勢識別器對象添加多個 Target-Action 。
    如果已經添加了一個 Target-Action,再次添加相同的 Target-Action 時,會被忽略。
    
    @param target 需要發送消息的 Target 對象
    @param action 向 Target 對象發送的消息,即方法名
    */
    - (void)addTarget:(id)target action:(SEL)action;
    

​ 在實際的開發過程中,使用比較多的是 UITapGestureRecognizer 和 UILongPressGestureRecognizer 兩個手勢識別器,這兩個手勢識別器分別是處理輕拍手勢和長按手勢。

二、手勢全埋點

​ 在數據採集中,一般只需要採集常見控制項(UILabel、UIImageView)的輕拍和長按手勢。
所以,我們分別介紹如何實現控制項輕拍和長按手勢的全埋點。

2.1 UITapGestureRecognizer 全埋點

​ 為了採集控制項的輕拍手勢,我們可以通過 Method Swizzling 交換 UITapGestureRecognizer 類的添加 Target-Action 的方法,從而可以添加一個新的 Target-Action,併在新添加的 Action 方法中觸發 $AppClick 事件,從而就可以達到採集控制項輕拍手勢全埋點的效果。

在 UITapGestureRecognizer 類中,用於添加 Target-Action 方法有兩個:

• - initWithTarget:action:

• - addTarget:action:

因此,我們需要對這兩個方法分別進行交換。

第一步:創建 UITapGestureRecognizer 分類 UIGestureRecognizer+SensorsData,並實現 +load 類方法,在 + load方法中,進行 - initWithTarget:action: 和 - addTarget:action: 的方法交換。

#import "UIGestureRecognizer+SensorsData.h"
#import "NSObject+SASwizzler.h"
#import "SensorsAnalyticsSDK+Track.h"

@implementation UITapGestureRecognizer (SensorsData)

+ (void)load {
    [UITapGestureRecognizer sensorsdata_swizzleMethod:@selector(sensorsdata_initWithTarget:action:) withMethod:@selector(initWithTarget:action:)];
    [UITapGestureRecognizer sensorsdata_swizzleMethod:@selector(addTarget:action:) withMethod:@selector(sensorsdata_addTarget:action:)];
}

- (instancetype)sensorsdata_initWithTarget:(id)target action:(SEL)action {
    [self sensorsdata_initWithTarget:target action:action];
    [self addTarget:target action:action];
    return self;
}

- (void)sensorsdata_addTarget:(id)target action:(SEL)action {
    [self sensorsdata_addTarget:target action:action];
    
    // 新增 Target-Action, 用於觸發 $AppClick 事件
    [self sensorsdata_addTarget:self action:@selector(sensorsdata_trackTapGestureAction:)];
}

- (void)sensorsdata_trackTapGestureAction:(UITapGestureRecognizer *)sender {
    [[SensorsAnalyticsSDK sharedInstance] trackAppClickWithView:view properties:nil];
}

第二步:在 - sensorsdata_trackTapGestureAction: 方法中判斷要採集的控制項

- (void)sensorsdata_trackTapGestureAction:(UITapGestureRecognizer *)sender {
    UIView *view = sender.view;
    // 暫定只採集 UILabel 和 UIImageView
    BOOL isTrackClass = [view isKindOfClass:UILabel.class] || [view isKindOfClass:UIImageView.class];
    if (!isTrackClass) {
        return;
    }
    [[SensorsAnalyticsSDK sharedInstance] trackAppClickWithView:view properties:nil];
}

第三步:測試驗證

{
  "event" : "$AppClick",
  "time" : 1648892963385,
  "propeerties" : {
    "$model" : "x86_64",
    "$manufacturer" : "Apple",
    "$element_type" : "UIImageView",
    "$lib_version" : "1.0.0",
    "$os" : "iOS",
    "$app_version" : "1.0",
    "$screen_name" : "ViewController",
    "$os_version" : "15.2",
    "$lib" : "iOS"
  }
}

2.2 UILongPressGestureRecognizer 全埋點

​ 對於 UILongPressGestureRecognizer 來說,其實現邏輯與 UITapGestureRecognizer 基本上是相同的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...