咱们如今有一个需求,某一个活动须要拉新所谓的拉新通常是推App下载,这个用户经过这个活动下载了App后,咱们须要作到【在数据库中记录这个用户下载这个App是经过那个二维码渠道的,从效果上说,咱们指望:html
① 每一个活动(渠道)在数据表中有一条记录,而一旦有通过该渠道下载的App被打开后,该渠道的下载量会+1,算KPI的(单独一条记录,带有时间戳)前端
② App首次打开时,若是检测到了渠道上报后,还应该为该App打上一个全局的渠道标志,后续的全部请求都应该将此参数带上,为后续产生订单以及流水作准备ios
好比以前咱们为H5与Server的Ajax请求约定的是这样的:web
1 var param = { 2 //公共参数 3 common: { 4 us: '渠道', 5 version: '1.0.0' 6 }, 7 other: '' // 业务参数 8 };
每次请求就一定会带上业务参数,而us就是native须要带的渠道参数,固然native的公共参数比前端多的多,需求明确后,咱们清理下iOS引导至App Store的通常流程。数据库
这边的通常流程是,咱们一个App活动,或者咱们一次推广,通常来讲都会用微信打开这个网址,这个是前提一:浏览器
① 咱们的一次下载来源于一次活动(推广或者固定的下载地址),而微信是主要的打开设备微信
而后,咱们要引导至App Store,通常来讲会访问一个H5页面(在微信中会引导在Safari浏览器中打开),而后由H5下载落地页跳到App Store完成下载,这个是第二个前提:cookie
② 咱们每次是由一个统一的带渠道因子的H5页面,引导至App Store的app
在上述基础上,咱们指望:有一个惟一的H5引导下载落地页(这里基本会抛弃微信应用宝引导下载了)dom
这里初步的实现方案是:
打开H5落地页时候,将此次活动的渠道号以及ip+ua+时间戳传给server端记录,若是在必定时间内,机型和ip成功匹配,则认为此次下载来源与此次渠道号
这里须要:
① Server端,提供一个接口,记录当前渠道+ip+ua+时间戳+屏幕信息(全部能记录的都记录),提供一个渠道匹配判断标志
② H5访问落地页的时候上报相关信息
③ Native首次打开的时候,调用native提供的判断接口,给该次App打标志
这里提出了三个要素:
① H5落地页
② server上报接口
② server检查接口
而这种方案是不精确的,H5若是能拿到设备号这类惟一标识的话,便能大大提升准确性,而后不管微信jsdk或者Safari都是作不到的,而网上搜索的方案,提到了一个SFSafariViewController,彷佛能达到共享cookie的做用,因而进行了一番探索。
咱们调研下来,在咱们的场景下,大概是这么一个状况:
① 咱们使用Safari打开一个页面,而且操做cookie
② 在咱们的App中,SFSafariViewController这个库能打开一个咱们给予的Url,而且这个网页若是和上面是一个域名cookie是共享的
这个就颇有意思了,咱们就彻底能够这样作了:
① 访问H5下载落地页访问接口上报时,Server往cookie种入惟一标识然后引导至App Store
② App首次打开时,以隐藏状态打开上报页面,由于同域名,会将Safari的cookie带上,这里也会带上IP等标识
③ Server打标签,若是判断有cookie或者ip匹配则返回相关渠道
④ H5检查页,使用Hybrid交互,告诉native给该App打上标识
let vc = SFSafariViewController(url: URL(string: "http://domain.com/landing.html")!)
这里方案肯定,而后开始落地实施试试状况,后续在数据展现一块以友好的方式展现出来,即是大数据的一环
参考文章:https://www.sensorsdata.cn/blog/analyze-distribution-channel-of-ios-app/