欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

IOS App 無代碼入侵的方法hook詳細介紹

 更新時間:2016年12月16日 17:19:32   投稿:lqh  
這篇文章主要介紹了IOS App 無代碼入侵的方法hook詳細介紹的相關(guān)資料,需要的朋友可以參考下

iOS App 無代碼入侵的方法hook

繼續(xù)Objective-C runtime的研究

最近公司項目在做用戶行為分析

于是App端在某些頁面切換,交互操作的時候需要給統(tǒng)計系統(tǒng)發(fā)送一條消息

在幾十個Controller 的項目里,一個一個地加代碼那完全是不可能的,維護起來也是吃力

但這里需要處理的是 Controller, 可以有以下方式實現(xiàn)上述需求

1. 利用Objective-C 中的對象繼承

  繼承 在面向?qū)ο箝_發(fā)中是非常常用的,像我們現(xiàn)在做的項目工程中都會有一個BaseViewController,

所有新建的ViewController都繼承BaseViewController,通過往BaseViewController中添加一些公共方法\屬性 可以被他們的子類所調(diào)用

這是統(tǒng)一我們工程中所有視圖控制器樣式的一個主要途徑

2.利用Category 和Runtime實行方法hook

  hook方案有一個好處,就是可以避免代碼入侵,做到更加廣泛的通用性.通過swizzling我們可以將原method與自己加入的method相結(jié)合,

即不需要在原有工程中加入代碼,又能做到全局覆蓋

兩種方案對比:

  通過繼承父類來實現(xiàn) 相對于hook來說 是較為準確的,因為需要被統(tǒng)計的頁面都是繼承于這個父類的控制器,而其他的如UINavigationController,系統(tǒng)自帶的UIAlertController等則不會誤入統(tǒng)計數(shù)據(jù)當中

  上面提到 hook方案是通過hook UIViewController viewdidload/viewdidappear等方法,而這些方法實際上 每個Controller 都會調(diào)用,那么就會出現(xiàn)不該出現(xiàn)的Controller 也出現(xiàn)在這里(如上面說到的UINavigationController和UIAlertController).但hook方案一個比較好的特點是無代碼入侵,在不修改項目代碼的前提下完成工作.

考慮到 行為分析統(tǒng)計系統(tǒng) 有可能被公司其他項目中所應(yīng)用,這里采用hook方案.那么當中必然會出現(xiàn) 不該統(tǒng)計的卻被統(tǒng)計 的情況,后面再作分析.

既然用到hook方案,又要用runtime 的swizzling

首先 新建一個UIViewController 的category

實現(xiàn)swizzling代碼

+ (void)load{
  [super load];
  
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{
    // 假如要打開controller的統(tǒng)計 ,則把下面這行代碼打開
    __gbh_tracer_swizzleMethod([self class], @selector(viewDidAppear:), @selector(__gbh_tracer_viewDidAppear:));
  });
}

嗯,看到這里大家會發(fā)現(xiàn) 這里調(diào)用的是一個C的方法,然而這個C方法是怎么實現(xiàn)的呢?看下面

void __gbh_tracer_swizzleMethod(Class class, SEL originalSelector, SEL swizzledSelector){
  Method originalMethod = class_getInstanceMethod(class, originalSelector);
  Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
  
  BOOL didAddMethod =
  class_addMethod(class,
          originalSelector,
          method_getImplementation(swizzledMethod),
          method_getTypeEncoding(swizzledMethod));
  
  if (didAddMethod) {
    class_replaceMethod(class,
              swizzledSelector,
              method_getImplementation(originalMethod),
              method_getTypeEncoding(originalMethod));
  } else {
    method_exchangeImplementations(originalMethod, swizzledMethod);
  }
}

這是一個標準的swizzling寫法,當然了 github上面也有關(guān)于swizzling的開源庫,用起來也順手 這里就不多說

看回第一塊代碼,紅色的viewDidAppear是即將被我hook的方法,__gbh_tracer_viewDidAppear 則是我需要實現(xiàn)的方法

- (void)__gbh_tracer_viewDidAppear:(BOOL)animated{
  [self __gbh_tracer_viewDidAppear:animated]; //由于方法已經(jīng)被交換,這里調(diào)用的實際上是viewDidAppear:方法
  
   //設(shè)置不允許發(fā)送數(shù)據(jù)的Controller
  NSArray *filter = @[@"UINavigationController",@"UITabBarController"];
  NSString *className = NSStringFromClass(self.class);
  if ([filter containsObject:className]) return ; //如果該Controller在不允許發(fā)送log的列表里,則不能繼續(xù)往下走
  
  if ([self.title isKindOfClass:[NSString class]] && self.title.length > 0){ //有標題的才符合我的要求
    // 這里發(fā)送log
  }

}

嗯,剛剛說到有部分Controller我是不發(fā)數(shù)據(jù)的,這里有兩重判斷,一個是加入到黑名單,另一個是 判斷Controller的title屬性是否為空

以上判斷基本能滿足我這個行為分析統(tǒng)計系統(tǒng)的需求,若還需要什么判斷還可以繼續(xù)加

以此 我只需要往工程里面添加這個Category,這個viewDidAppear就會被hook出來,可以為所欲為..

另外 需求中還提到 需要在應(yīng)用啟動的時候發(fā)送一次init消息

hook?可以,但我更傾向與利用category+NSNotification,因為系統(tǒng)中已經(jīng)有 UIApplicationDidFinishLaunchingNotification

這種通知,直接用就可以

@implementation UIApplication (GBHTracer)
+ (void)load{
  [super load];
  
  static dispatch_once_t onceToken;
  dispatch_once(&onceToken, ^{ //只執(zhí)行一次就可以了
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(__gbh_tracer_applicationDidFinishLaunching:) name:UIApplicationDidFinishLaunchingNotification object:nil];
  });
}

+ (void)__gbh_tracer_applicationDidFinishLaunching:(NSNotification *)noti{
  //應(yīng)用啟動時為所欲為!
}

@end

嗯..我們的行為分析統(tǒng)計系統(tǒng)就在原工程不Import一個頭文件 不調(diào)用 任何一個方法就可以達到統(tǒng)計效果.

但是像什么操作響應(yīng)的時候的統(tǒng)計,還是需要各位看官在響應(yīng)中調(diào)用相應(yīng)的方法

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • IOS 鍵盤擋住輸入框的問題解決辦法

    IOS 鍵盤擋住輸入框的問題解決辦法

    這篇文章主要介紹了IOS 鍵盤擋住輸入框的問題解決辦法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06
  • ios動態(tài)庫和靜態(tài)庫的區(qū)別

    ios動態(tài)庫和靜態(tài)庫的區(qū)別

    這篇文章主要介紹了ios動態(tài)庫和靜態(tài)庫的區(qū)別,幫助大家更好的理解和學(xué)習(xí)使用ios開發(fā),感興趣的朋友可以了解下
    2021-04-04
  • iOS 項目中的version和build 詳解

    iOS 項目中的version和build 詳解

    這篇文章主要介紹了iOS 項目中的version和build 詳解的相關(guān)資料,需要的朋友可以參考下
    2016-11-11
  • ios實現(xiàn)文件對比的方法

    ios實現(xiàn)文件對比的方法

    這篇文章主要介紹了ios實現(xiàn)文件對比的方法,主要是用到了filemanager,有需要的小伙伴可以參考下。
    2015-05-05
  • 淺談iOS應(yīng)用中的相關(guān)正則及驗證

    淺談iOS應(yīng)用中的相關(guān)正則及驗證

    下面小編就為大家?guī)硪黄獪\談iOS應(yīng)用中的相關(guān)正則及驗證。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • ios利用RunLoop原理實現(xiàn)去監(jiān)控卡頓實例詳解

    ios利用RunLoop原理實現(xiàn)去監(jiān)控卡頓實例詳解

    這篇文章主要為大家介紹了ios利用RunLoop原理實現(xiàn)去監(jiān)控卡頓實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • iOS拍照后圖片自動旋轉(zhuǎn)90度的完美解決方法

    iOS拍照后圖片自動旋轉(zhuǎn)90度的完美解決方法

    今天開發(fā)一個拍照獲取照片的功能的時候, 發(fā)現(xiàn)上傳之后圖片會自動旋轉(zhuǎn)90.在測試中發(fā)現(xiàn)只要是圖片大于2M, 系統(tǒng)就會自動翻轉(zhuǎn)照片。下面小編通過本文給大家分享下解決辦法
    2016-12-12
  • iOS開發(fā)中Swift逃逸閉包知識

    iOS開發(fā)中Swift逃逸閉包知識

    這篇文章主要介紹了iOS開發(fā)中Swift逃逸閉包的相關(guān)知識點以及需要注意的地方,需要的朋友收藏下吧。
    2018-02-02
  • IOS 應(yīng)用程序管理的實現(xiàn)

    IOS 應(yīng)用程序管理的實現(xiàn)

    這篇文章主要介紹了IOS 應(yīng)用程序管理的實現(xiàn)的相關(guān)資料,希望通過本文能幫助到大家,讓大家實現(xiàn)這樣的功能,需要的朋友可以參考下
    2017-10-10
  • iOS中視頻播放的基本方法總結(jié)

    iOS中視頻播放的基本方法總結(jié)

    這篇文章主要給大家介紹了關(guān)于iOS中視頻播放的基本方法的相關(guān)資料,文中分別介紹了MPMoviePlayerController、MPMoviePlayerViewController、AVPlayer以及AVPlayerViewController四種方法,需要的朋友可以參考下
    2018-07-07

最新評論