iOS项目开发后期添加友盟统计

本文介绍了一种在Swift项目中优化友盟统计调用的方法,通过运行时替换UIViewContorller的方法实现自动化统计,避免了在每个视图控制器中手动添加统计代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在项目开发后期,要添加友盟统计事件,在阅读友盟相关文档后了解.

友盟统计中要求在每个界面的viewWillAppear和viewWillDisappear方法中添加友盟统计方法:

    

    override func viewWillAppear(_ animated: Bool) {

        super.viewWillAppear(animated)

        MobClick.beginLogPageView("pageName")

    }

    

    override func viewWillDisappear(_ animated: Bool) {

        super.viewWillDisappear(animated)

        MobClick.endLogPageView("pageName")

    }

    


由于每个界面都要添加这个方法太过于繁琐,因此找个一个更好的办法来添加,通过借助运行时来进行解决:

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的方法出来.



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值