iOS項目開發後期添加友盟統計

在項目開發後期,要添加友盟統計事件,在閱讀友盟相關文檔後瞭解.app

友盟統計中要求在每一個界面的viewWillAppear和viewWillDisappear方法中添加友盟統計方法:ide

    

    override func viewWillAppear(_ animated: Bool) {spa

        super.viewWillAppear(animated)3d

        MobClick.beginLogPageView("pageName")orm

    }事件

    

    override func viewWillDisappear(_ animated: Bool) {開發

        super.viewWillDisappear(animated)文檔

        MobClick.endLogPageView("pageName")get

    }io

    


因爲每一個界面都要添加這個方法太過於繁瑣,所以找個一個更好的辦法來添加,經過藉助運行時來進行解決:

extension UIViewController {

    

    class func loadBySwift() {

        var m1: Method?

        var m2: Method?

        // 運行時替換方法

        m1 =  

              class_getInstanceMethod(self

                  #selector(statisticsViewWillAppear(_:)))

        m2 = 

              class_getInstanceMethod(self

                  #selector(viewWillAppear(_:)))


        method_exchangeImplementations(m1!, m2!)

        

        m1 = 

              class_getInstanceMethod(self,

                  #selector(statisticsViewWillDisappear(_:)))

        m2 = 

              class_getInstanceMethod(self

                  #selector(viewWillDisappear(_:)))


        method_exchangeImplementations(m1!, m2!)

    }

    

    @objc func statisticsViewWillAppear(_ animated: Bool) {

        self.statisticsViewWillAppear(animated)

        MobClick.beginLogPageView(String(describing: type(of: self)))

    }

    

    @objc func statisticsViewWillDisappear(_ animated: Bool) {

        self.statisticsViewWillDisappear(animated)

        MobClick.endLogPageView(String(describing: type(of: self)))

    }

}


在UIViewController拓展類裏添加這個方法,在運行時,viewWillAppear方法會被statisticsViewWillAppear替換,viewWillDisappear會被statisticsViewWillDisappear替換,並且每一個界面的viewWillAppear和viewWillDisappear方法仍然有效.

方法封裝好了,接下來是調用了,經過響應者鏈的傳遞方式,決定再拓展UIApplication這個類庫:


extension UIApplication {

    private static let classSwizzedMethodRunOnce: Void = {

        UIViewController.loadBySwift()

    }()

    

    open override var next: UIResponder? {

        UIApplication.classSwizzedMethodRunOnce

        return super.next

    }

}



這樣就不須要每一個界面裏都要進行調用了.

因爲最近在用Swift作項目,因此方法都是用Swift語法寫的,後期有時間會整理一套OC的方法出來.