iOS-曝光埋点

作者: 琦玉老师很强 | 来源:发表于2021-06-28 14:03 被阅读0次

背景

电商类APP列表页,用户上下滑动,列表页中的item显示在屏幕中,此时数据分析上来看,item的显示(比如滑动停止或者停止1s),都认为是一次数据的曝光,此时会根据曝光率(曝光率= 点击量 / 曝光量)来分析用户(比如用户的喜好推荐数据的统计)

监听View可见性

UITableView,UIColelctionView
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath;

- (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath*)indexPath API_AVAILABLE(ios(6.0));

- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath API_AVAILABLE(ios(8.0));

- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath;

willDisplayCell 和cellForRowAtIndexPath对比:
先执行cellForRowAtIndexPath再执行willDisplayCell,cellForRowAtIndexPath一半用于数据填充,willDisplayCell可用于自定义分割线,对于实时性的埋点曝光统计,可用willDisplayCell方法实现。

UIScrollVIew

UIScrollVIew 停止滚动的类型分为三种:

  • 快速滚动,自然停止
  • 快速滚动,手势介入停止
  • 快速滚动停止(上两种结合情况)
// 自然停止
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    BOOL scrollToScrollStop = !scrollView.tracking && !scrollView.dragging && !scrollView.decelerating;
    if (scrollToScrollStop) {
        [self scrollViewDidEndScroll];
    }
}

// 手势介入停止
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {
    if (!decelerate) {
        // 停止类型3
        BOOL dragToDragStop = scrollView.tracking && !scrollView.dragging && !scrollView.decelerating;
        if (dragToDragStop) {
            [self scrollViewDidEndScroll];
        }
    }
}

// 滚动停止事件
- (void)scrollViewDidEndScroll {
    NSLog(@"监测到滚动停止了");
}

对于滑动停止这种条件性的曝光埋点,可用UIScrollVIew滑动停止的方法实现。

曝光逻辑条件分析

对于条件性曝光埋点,采用UIScrollVIew滑动停止方法实现,具体曝光条件是

  • 刚进入页面时(加载新页面)
    (可见且>=50%,上报可见)
  • 滑动停止时
    ( 可见且>=50%,上报可见 )

上报时机就是监听滚动停止事件,做相关的埋点上传处理

可见性>=50%判断

获取tableview的可见cell
- (NSArray*)visibleCells;
返回一个UITableviewcell的数组。

- (NSArray*)indexPathsForVisibleRows;
返回一个NSIndexPath的数组

- (CGRect)rectForRowAtIndexPath:(NSIndexPath*)indexPath;
CGRect cellR = [tableView rectForRowAtIndexPath:indx];
获取对应NSIndexPath的CGRect

这里可以根据获取NSIndexPath的数组的cell,获取对应的NSIndexPath的CGRect,这里我们的列表是竖着滑动,我们只获取cell的origin.y和size.height这两个属性

视图讲解分析
手机显示原型图

根据上面视图,cell可见可分为三类:

  • 屏幕上方显示的部分
  • 屏幕中间全部显示的部分
  • 屏幕下方显示的部分
坐标系转换:

currentRect = tableView.convert(previousCellRect, to: self.view.superview)
计算相对于屏幕本身的rect属性

屏幕上方部分计算规则:
  • 第一种计算:
    超出屏幕部分 = currentRect.origin.y的绝对值
    判断:超出屏幕部分 / currentRect.size.height < 0.5
  • 第二种计算:
    留在屏幕的部分 = currentRect.origin.y + currentRect.size.height
    判断:留在屏幕的部分 / currentRect.size.height >= 0.5
屏幕下方部分计算规则:
  • 第一种计算:
    超出屏幕的部分 = (currentRect.origin.y + currentRect.size.height)- 屏幕的高
    判断:超出屏幕部分 / currentRect.size.height < 0.5
  • 留在屏幕的部分 = currentRect.size.height - 超出屏幕的部分
    判断:留在屏幕的部分 / currentRect.size.height >= 0.5
屏幕中间的部分:
  • 显示100%,通过判断直接埋点上报
具体代码如下(swift写法):
// 相关位置添加如下代码,循环遍历可见cell数组
for indexPath in tableView.indexPathsForVisibleRows ?? [] {
    self.exposureBuriedPoint(indexPath: indexPath)
}

// 曝光上报埋点,显示超过50%进行上报
func exposureBuriedPoint(indexPath: IndexPath) {

    let previousCellRect = tableView.rectForRow(at: indexPath)
    if previousCellRect.isEmpty == false {
        let cellRect = tableView.convert(previousCellRect, to: self.view.superview)
        let currentY = cellRect.origin.y + cellRect.size.height

        if cellRect.origin.y < 0 {
            let percentage = currentY / cellRect.size.height

            if percentage >= 0.5 {
                // 上报埋点
                //  ********* 进行曝光埋点相关统计处理代码写在这里 *********
            }
        } else {
            if currentY > ScreenHeight {
                let percentage = (currentY - ScreenHeight) / cellRect.size.height

                if percentage < 0.5 {
                    //  上报埋点
                    //  ********* 进行曝光埋点相关统计处理代码写在这里 *********
                }
            } else {
                //  上报埋点
                //  ********* 进行曝光埋点相关统计处理代码写在这里 *********
            }
        }
    }
}

相关文章

  • iOS-曝光埋点

    背景 电商类APP列表页,用户上下滑动,列表页中的item显示在屏幕中,此时数据分析上来看,item的显示(比如滑...

  • iOS 列表cell曝光埋点

    什么是曝光埋点,简单的说就是展示在屏幕上了,然后往服务端上传一个埋点。那列表cell的曝光埋点就是cell进入屏幕...

  • 埋点之眼球曝光

    埋点曝光需求要求在页面在用户的视野中就发送一个曝光日志,一个页面的一个模块最多发送一次,也就是首次曝光才发送,之后...

  • Web曝光埋点实现原理

    主要用到的API MutationObserver[https://developer.mozilla.org/z...

  • 页面曝光难点分析及应对方案

    曝光 曝光埋点分为两种: PV show 它俩都表示“展示”,但有如下不同: 概念不同:PV = Page Vie...

  • 2020-02-26 如何设计数据埋点

    案例:对活动入口的点击量进行埋点统计? 三种简单的前端埋点事件 曝光事件:记录页面被浏览次数,记录页面流量所用。 ...

  • Android实战——RecyclerView条目曝光埋点

    一、概要 100行代码实现recyclerview条目曝光埋点设计 二、设计思路 条目露出来一半以上视为该条目曝光...

  • 微信小程序--模块曝光埋点方法

    我们在处理模块曝光埋点时,需要根据页面滚动的位置判断模块是否可见(被曝光)。Web 上传统方法是增加页面 scro...

  • 全网最优雅安卓列表项可见性检测

    引子 业务开发中列表项的曝光埋点做得越来越精细了。 一开始,我是在 onBindView() 中上报列表项曝光的:...

  • iOS-无侵入的埋点方案

    前言 埋点统计在产品运营过程中对用户行为分析、产品前期的业务模式探索起着很重要的作用。常用的三种埋点方式主要包括手...

网友评论

    本文标题:iOS-曝光埋点

    本文链接:https://www.haomeiwen.com/subject/dwhqultx.html