在項目開發後期,要添加友盟統計事件,在閱讀友盟相關文檔後瞭解.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的方法出來.