利用runtime實現友盟app頁面訪問路徑功能

上個版本產品說運營有這樣的需求,苦逼的程序員敲代碼了,然后趕緊打開友盟看到如下文檔:

屏幕快照 2017-02-09 下午2.27.46.png

文檔的意思是要在每個VC的viewWillAppear和viewWillDisAppear添加對應的代碼來實現統計功能,看著這里想想我們的app,這么多模塊和VC,如果每個界面都這樣寫勢必工作量會很大,那有沒有簡單可行的辦法呢?有啊,要不我寫這篇文章干嘛

6767C6CA1343747E7A943E26F088E99E.gif

實現思路 使用runtime:
1:攔截系統的viewWillAppear和viewWillDisAppear
2:交換為我們自己定義的方法
3:執行對應的統計方法beginLogPageView和endLogPageView
4: 繼續執行原來方法

不想看文章的直接可以下載代碼demo,覺得不錯的請給我star謝謝??

  • 創建UIViewController的分類UIViewController+AS.h

  • 在.m里實現load類方法 分享一個方便好用的runtime庫

    + (void)load
    {
    
          Method viewWillAppear = class_getInstanceMethod(self, @selector(viewWillAppear:));
          Method new_viewWillAppear = class_getInstanceMethod(self, @selector(new_viewWillAppear:));
          method_exchangeImplementations(viewWillAppear, new_viewWillAppear);
          
          Method viewWillDisappear = class_getInstanceMethod(self, @selector(viewWillDisappear:));
          Method new_viewWillDisappear = class_getInstanceMethod(self, @selector(new_viewWillDisappear:));
          method_exchangeImplementations(viewWillDisappear, new_viewWillDisappear);
    }
    
  • 實現替換的方法 (self.title就是每個導航欄上的title,對于沒有使用導航欄或者是導航欄title并不能區分是哪個模塊的那個頁面,(都是商品詳情頁,但是一個是品牌館模塊,一個是超市模塊)這種情況需要給系統的UIViewController添加自定義屬性)標記問題1文章末尾會解決
    - (void)new_viewWillAppear:(BOOL)animated{
    if (self.title.length) {

              [MobClick beginLogPageView:self.title];
              NSLog(@"路徑開始%@==%@  %s",NSStringFromClass(self.class),self.title,__func__);
          }
          [self new_viewWillAppear:animated];
      }
    
      - (void)new_viewWillDisappear:(BOOL)animated{
          if (self.title.length) {
              NSLog(@"路徑結束%@==%@ == %s",NSStringFromClass(self.class),self.title,__func__);
              [MobClick endLogPageView:self.title];
          }
          [self new_viewWillDisappear:animated];
      }
    
  • 我們的代碼規范是在每個VC的loadView方法里去寫一些當前vc顯示的相關的代碼.比如在AViewController里,可以這樣:
    - (void)loadView{
    [super loadView];
    self.title = @"我是AVC界面";
    }

以上就可以少量代碼實現行為路徑的統計,具體可以看代碼,畢竟代碼才是程序員溝通的語言??

使用runtime給系統類添加屬性
接上邊的問題1,給ViewController添加自定義屬性:

  • 在分類UIViewController+AS.h 中聲明一個屬性為@property (copy, nonatomic) NSString *umengLogAs;

  • 實現set get方法
    - (void)setUmengLogAs:(NSString *)umengLogAs{

          objc_setAssociatedObject(self, @selector(umengLogAs), umengLogAs, OBJC_ASSOCIATION_COPY_NONATOMIC);
      }
    
      - (NSString *)umengLogAs
      {
          // 根據關聯的key,獲取關聯的值。
          return objc_getAssociatedObject(self,  _cmd) ;
      }
    

打完,收工!

_cmd 是什么: 在Apple的官方介紹里看到輕描淡寫的說了一句:“The _cmd variable is a hidden argument passed to every method that is the current selector”,其實說的就是_cmd在Objective-C的方法中表示當前方法的selector,正如同self表示當前方法調用的對象實例一樣。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,788評論 0 9
  • 轉載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 772評論 0 2
  • 本文轉載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 799評論 0 1
  • 我們常常會聽說 Objective-C 是一門動態語言,那么這個「動態」表現在哪呢?我想最主要的表現就是 Obje...
    Ethan_Struggle閱讀 2,232評論 0 7
  • 本文詳細整理了 Cocoa 的 Runtime 系統的知識,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 827評論 0 4