1. 程式人生 > >iOS無埋點資料採集

iOS無埋點資料採集

移動開發經過前幾年爆炸式的增長之後,移動開發進入了一個精細化管理操作的時期,除了拓展自己的能力,在移動開發外尋求到更好的職業道路這條路外,移動開發這份工作的做法怕也是需要有一番觀念上的變動。

為什麼做資料採集

對於應用內的定向、精細化管理,其中重要一點就是App內資料採集。

  1. 使用者使用最多的功能是什麼?
  2. 使用者停留時間最長的頁面是哪個?
  3. 使用者增長量、使用時段是怎麼樣分佈?
    等等問題,需要從線上App中採集到最真實的資料,經過合理分析,對未來產品進行直觀資料性的指導,著重設計出更符合使用者使用習慣的產品功能。

資料採集怎麼做

埋點資料採集

資料採集可分為 埋點資料採集和無埋點資料採集,從名字字面可以分出二者的區別,埋點資料採集目前國內的主要第三方資料分析服務商,如百度統計、友盟、TalkingData 等都提供了這一方案,以友盟提供SDK為例


//自動頁面時長統計, 開始記錄某個頁面展示時長.
+ (void)beginLogPageView:(NSString *)pageName;
//自動頁面時長統計, 結束記錄某個頁面展示時長.
+ (void)endLogPageView:(NSString *)pageName;
//結構化事件
+ (void)event:(NSArray *)keyPath value:(int)value label:(NSString *)label;

在需要進行統計的頁面上進行資料採集埋點,呼叫SDK對應提供的API,完成資料統計,埋點資料採集的好處是在於:呼叫直觀簡單、API對開發者友好、另外由於這些大廠商進入該領域很早,已經佔領了很大的移動開發市場有了很健壯便捷的服務提供、同時提供了非常豐富的各種表項。

不好的地方在於:

  1. 資料採集買點程式碼與專案程式碼混合在一起,增加了專案開發、維護的成本,每一處埋點都需要合理、明晰的說明才能保證專案在迭代中不會因為改動失去部分資料的採集;
  2. 埋點程式碼是在開發中預先寫入的,需要跟隨相應版本進行調整;
  3. 埋點程式碼上線後與業務程式碼是同等級別,當出現錯埋、漏埋等情況,無法動態更新及新增;

無埋點資料採集

在介紹無埋點資料採集之前,首先需要將Objective-C 作為動態語言的特性進行講解,這是實現無埋點資料採集的基石。

Objective-C作為動態語言,Class在是runtime中建立的, selector, method, imp, protocol等都是隨後繫結上去的,這是所謂的執行時繫結。一個典型的例子如下
這裡寫圖片描述

首先在runtime中能夠查出當前執行時環境中所有的類,每個類中的方法,每個類訊息的繫結,每個類的實現的協議,每個協議的定義,每個類當前的訊息快取等一切你想知道的東西。

其次runtime底層Class實現是對訊息轉發實現的,Class的方法呼叫都是間接的。

基於以上兩個特性促成了Objective-C的黑魔法 Method Swizzling,Method Swizzling的實現邏輯如下圖所示。

這裡寫圖片描述

新建一個數據節點採集的類,交換被採集的類和 採集節點的 對應兩個selector對應的IMP。在採集節點中對資料進行收集。

在以上基礎上,對Objective-C中的類介面進行對應資料的採集。

系統類資料採集

iOS提供的基礎類的selecter都是已知的,因此較為簡單,只需要通過在對應類呼叫之前進行對應介面的hook,在hook方法中進行相應的資料採集即可。

下面的例子以對UIViewController 為例,在每個頁面中採集使用者在一個頁面內停留的時間,實現程式碼如下:

這裡寫圖片描述

在宣告的對進行資料採集分析的類 CCAnalyseViewControllerAnalyseNodeload 方法中加入對UIViewController 兩個方法和本類的方法的IMP進行交換。

這裡寫圖片描述

- (void)viewDidAppear:(BOOL)animated;

- (void)viewDidDisappear:(BOOL)animated;

CCAnalyseViewControllerAnalyseNode 例項化之後,每個UIViewController 在載入、退出的時候呼叫上面兩個方法時,執行順序如下圖所示:

這裡寫圖片描述

此時就能夠在UIViewController 對應2個方法中都加入了可以用來相應資料採集的方法,就可以在對應的hook方法中進行頁面停留時間的採集。
思路同上,如果需要對使用者操作習慣和常用功能的進行統計,可以對UIControl 方法進行hook實現。
這裡寫圖片描述

這裡寫圖片描述

除此之外,對於 UITableViewUIViewController 常用的控制元件,可以通過hook 對應的 delegate 方法,獲取在實際使用中業務賦值給對應cell的資料、或者cell點選事件。

以上兩個例子是對系統提供的類進行資料採集的例子。

使用者自定義類資料採集

正如上一節開頭所言,由於系統提供類selector都是已知的,所以實現起來較為簡單,而對於使用者自定義類在selector未知的情況下,如何進行hook?
首先在採集節點中植入一個能夠對所有 Class 進行解析的 介面,然後通過線上進行部署,其次將Class的ClassName、seletor引數下發給資料採集SDK,實現對使用者自定義Class的資料採集。

  1. 使用者自定義Class未知selector在採集節點中IMP的插入
- (void) analyseUserdefinedTarget:(NSString *)targetClass action:(nullable SEL)action method:(IMP)method;

該介面的具體實現為:

- (void) analyseUserdefinedTarget:(NSString *)targetClass action:(nullable SEL)action method:(IMP)method{

    if (targetClass !=nil && action !=nil) {
        Class target = NSClassFromString(targetClass);
        NSObject *temp = [[target alloc]init];
        if ([temp respondsToSelector:action]) {
            NSString * methodName = NSStringFromSelector(action);
            Method m_gesture = class_getInstanceMethod([target class], action);

            SEL hook_sel = NSSelectorFromString([NSString stringWithFormat:@"hook_%@",methodName]);
            if (method == nil) {
                method = (IMP) myHookMethodIMP;
            }
            if (![[CCAnalyseBasicAnalyseNode sharedInstance] respondsToSelector:hook_sel]) {
                class_addMethod([CCAnalyseBasicAnalyseNode class], hook_sel, method, method_getTypeEncoding(m_gesture));
                class_addMethod([target class], hook_sel, method_getImplementation(m_gesture), method_getTypeEncoding(m_gesture));
            }
            method_setImplementation(m_gesture, class_getMethodImplementation([CCAnalyseBasicAnalyseNode class], hook_sel));

        }

    }
}

以上程式碼的邏輯是:對使用者自定義Class進行selector檢查,如果該類的確有對應介面,才需要對愛selector進行hook,避免對未宣告的selector進行處理出現崩潰。在採集節點中去檢查新增的hook介面是否存在,不存的話,在runtime中新增selector、和對應的IMP;最後將被採集使用者自定義類的selector指向的IMP與新新增的IMP進行交換。在myHookMethodIMP中完成對該介面的資料採集分析。
2. IMP的實現、以及IMP中資料採集,以上文中 myHookMethodIMP為例,看IMP的具體實現

void myHookMethodIMP(id self, SEL _cmd,id arg0)
{
    if ([self respondsToSelector:_cmd]) {
        NSString * methodName = NSStringFromSelector(_cmd);
        SEL hook_sel = NSSelectorFromString([NSString stringWithFormat:@"hook_%@",methodName]);

        controlInfo = [NSMutableDictionary new];
        [controlInfo setObject:[NSString stringWithUTF8String:object_getClassName(self)] forKey:ACTIONTARGET];

        [controlInfo setObject:methodName forKey:ACTIONNAME];
        [controlInfo setObject:[NSNumber numberWithInteger:ActionTypeUserdefined] forKey:ACTIONTYPE];

        if (arg0 !=nil) {
            if ([arg0 isKindOfClass:[NSObject class]] ) {

                if ([arg0 isKindOfClass:[NSString class]]||[arg0 isKindOfClass:[NSNumber class]]||[arg0 isKindOfClass:[NSArray class]]||[arg0 isKindOfClass:[NSDictionary class]]||[arg0 isKindOfClass:[NSNull class]]) {
                    [controlInfo setObject:arg0 forKey:ACTIONINFO];
                }

            }else{

                [controlInfo setObject:[NSValue valueWithNonretainedObject:arg0] forKey:ACTIONINFO];
            }
        }

        NSDictionary *reportInfo = @{[NSNumber numberWithInteger:[self hash]]:controlInfo};
        addActionReport(reportInfo);

        if ([self respondsToSelector:hook_sel]) {
            IMP imp = [self methodForSelector:hook_sel];
            void (*func)(id, SEL,id) = (void *)imp;
            if (imp!=NULL) {
                func(self, hook_sel,arg0);
            }
        }

    }
}

在IMP中,採集到該selector介面的引數之外,仍然需要呼叫原類中IMP,實現原來Class的方法。
iOS 如何實現可變引數的IMP,實現對使用者自定義類hook
3. 線上下發需要被採集Class的相關引數;

舉如下例子,採集UILabel的 text,使用該節點採集介面使用方式如下

        [[CCAnalyseManager sharedInstance] analyseUserdefinedTarget:@"UILabel" action:@selector(setText:)];

實際使用中,通過線上管理系統向資料採集SDK,下發指令資料,SDK內完成對JSON的解析,即可以實現線上實時管理需要採集的資料。

{
    "className": "UILabel",
    "selectorName": "setText"
}

綜上所述,使用無埋點資料採集方案可以實現埋點資料採集方案不足的地方:
1.實現自動收集基本的頁面和事件資訊,分離資料採集與業務程式碼;
2.資料採集型別與需求根據線上配置設定與操控,無需再耗費大量的時間和精力對需要統計的頁面和事件挨個單獨埋點。
3.線上管理配置、增加資料採集需求時,也無需再次發版。不再為少埋點、漏埋點而發愁。

相關推薦

iOS資料採集

移動開發經過前幾年爆炸式的增長之後,移動開發進入了一個精細化管理操作的時期,除了拓展自己的能力,在移動開發外尋求到更好的職業道路這條路外,移動開發這份工作的做法怕也是需要有一番觀念上的變動。 為什麼做資料採集 對於應用內的定向、精細化管理,其中重要一點

iOS資料SDK實踐之路

SDK 已經具備不需要程式碼埋點就能 自動的、動態可配的、全面且正確 的收集使用者在使用 App 時的所有事件資料。除此之外,還單獨開發了與之配合的圈選SDK,能夠在 App 端完成對介面元素的圈配以及 KVC 配置的上傳。而介面元素圈配的工作完全可以交給用研與產品人員來做,減輕了開發人員的工作量。SDK 已

揭祕數極客Android資料採集原理

  採集資料柯林斯基本分為程式碼埋點狀語從句:無埋點。近年來無埋點的資料採集方案越來越普及,而無埋點的實現方案也有多種,我們今天討論的問題是資料採集的一種方案,是無需開發人員重複進行採集事件的程式碼埋點就能達到採集客戶端所需資料的解決方案,也就是無埋點資料採集方案。 介紹無埋

資料採集

隨著移動網際網路時代的興起和資料量的大規模爆發,越來越多的網際網路企業開始重視資料的質量,使用者對資料的需求已經不僅僅侷限於簡單的 PV、UV,而是更加重視使用者使用行為資料的相關分析。在資料分析的道路上,資料採集是重中之重。資料採集的質量直接決定了你的分析是否準確。而隨著企

APP流程(zt)

1、首先什麼是無埋點呢,其實所謂無埋點就是開發者無需再對追蹤點進行埋碼,而是脫離程式碼,只需面對應用介面圈圈點點即可追加隨時生效的事件資料點。   無埋點的好處

iOS點數據SDK實踐之路

情況下 正則表達 targe uic slideview 而是 uicontrol 訂單 獲取 SDK 已經具備不需要代碼埋點就能 自動的、動態可配的、全面且正確 的收集用戶在使用 App 時的所有事件數據。除此之外,還單獨開發了與之配合的圈選SDK,能夠在 App 端完成

ASM插樁實現Android端效能監控

Android端無埋點實現頁面效能監控 背景 當我們需要了解頁面載入效能時,可以通過手動埋點的方式記錄頁面階段耗時、網路耗時、資料庫載入耗時以及其他耗時點,配合slardar平臺,能直觀地瞭解到頁面的效能情況。 但隨著業務變動,手動埋點存在易寫錯,難維護的麻煩。業界廣泛

統計SDK實踐

背景 埋點模組是一個完整的系統不可獲取的一部分,無論是移動端,Web端還是後端(後端可能傾向於叫日誌系統)。當然,現在也有很多第三方的埋點SDK,如友盟,接入也很簡單,只需要幾行程式碼即可使用。但大多都是侵入式,也就是說,在每個需要埋點的地方手動新增程式碼,這樣耦合性太大,雖然可通過二次封裝的方式,降低對這

網易HubbleData之Android實踐[轉]

轉自 https://neyoufan.github.io/2017/07/11/android/%E7%BD%91%E6%98%93HubbleData%E4%B9%8BAndroid%E6%97%A0%E5%9F%8B%E7%82%B9%E5%AE%9E%E8%B7%B5/ 網易H

技術簡介

最近無埋點技術很是流行,抽空研究了下諸葛IO,talkingData以及百分點這些業內知名公司的無埋點SDK,抽取其中重要的資訊供大家參考: 1、首先什麼是無埋點呢,其實所謂無埋點就是開發者無需再對追蹤點進行埋碼,而是脫離程式碼,只需面對應用介面圈圈點點即可追加隨時生效的事

揭開JS技術的神祕面紗

<!-- start Mixpanel--><script type="text/javascript">(function(e,a){if(!a.__SV){var b=window;try{var c,l,i,j=b.location,g=j.hash;c=function(a,b

基於技術的使用者行為分析

用戶行為分析從狹義來看是用戶的行為資料分析,但是廣義來說這一個詞包含用戶分析,用戶行為的結果分析,用戶的行為分析。用戶行為的結果和用戶的行為分析是不一樣的,一個是結果,一個是過程。現在國內市場上關於用戶行為分析的產品分為基於前臺資料的用戶行為分析和基於後臺資料的用戶行為分

Java位元組碼插樁修改HiBeaver(結合ASM,實現Hook需求、輕量級AOP、統計上報等)

Java彙編指令- https://segmentfault.com/a/1190000008606277 一次Android位元組碼插樁實戰- https://segmentfault.com/a/1190000008658815 Android位元組碼修改神器HiBeav

Android視覺化()的具體實現

Android埋點技術深入探究 上一篇文章提到的無埋點技術在實際應用中有以下幾個問題需要處理。 大綱: 【1】控制元件的唯一標識問題怎麼處理。 【2】當控制元件處於可滑動的元件內或者整個介面就是一個可滑動的View中時位置如何確定。 【3】Frag

APP流程

最近無埋點技術很是流行,抽空研究了下諸葛IO,talkingData以及百分點這些業內知名公司的無埋點SDK,抽取其中重要的資訊供大家參考:1、首先什麼是無埋點呢,其實所謂無埋點就是開發者無需再對追蹤點進行埋碼,而是脫離程式碼,只需面對應用介面圈圈點點即可追加隨時生效的事件資

android自定義()收集使用者行為統計 (非常方便 可以自己拓展)

EventCollect 這是收集使用者行為統計的程式碼 reademe: 需求:: 用於App統計使用者行為 。 實際上就是監控所有事件 並把事件 傳送到服務上去 要求: 可以監控使用者的所有行為,例如使用者誰(沒有登入的情況使用UUID), 進入

微信小程式之函式呼叫監控

有時候,面對一個bug,左思右想就是無法理解為什麼。我就有過這樣的經歷,耗時整個一個晚上,後來還是放棄了。不得不在所有可能的點都加上日誌,部署等待再次報錯,真的很讓人抓狂!而實際上,解決一個bug的關鍵就是復現(reproduce),真正解決bug也許就是改動一兩個字元的事情。因此,如果能夠知道出錯函式被呼叫

前端業務的監控與資料的上報

我曾經在 2018 年 12 月底的時候,發表過[Vue 單頁面中進行業務資料的上報](https://www.xiabingbao.com/post/vue/vue-boss-up.html),現在這 1 年多以來,我對此也有了更深的理解。 這裡,我們還是主要探討業務資料的上報,關於頁面效能和錯誤日誌的收

資料採集簡介之 程式碼、視覺化

博主做移動手機系統中的資料採集與埋點也有近兩年,那段時間內一方面是集中在具體的開發和問題細節處理,另外一方面則是在把採集系統適配到不同的平臺手機、平板、tv、車載的過程中,有Android和C++兩個版本。有一天見到了“神策資料”的這篇博文,發現總結得太好了,有點相見恨晚的感覺。這篇文章裡面闡述了一

資料採集與分析的那些事——從資料到AB測試

作者:網易有數鄭棟。 一、為什麼企業需要一套完善的使用者行為埋點和分析平臺 產品初創期間,需要分析天使使用者的行為來改進產品,甚至從使用者行為中得到新的思路或發現來調整產品方向;產品成長過程,通過對使用者行為的多角度(多維)分析、對使用者群體的劃分以及相應行為特徵的分析和比較,來指導產品設計、運營活動,並