iOS app与浏览器 跨域互通

chiphomer 8年前
   <p> </p>    <p>本文主要介绍,app跨域访问app外部的浏览器的数据的方案,包括外部safari,或者QQ,微信,手百等外部app内的浏览器。</p>    <h2>主要使用场景就是:</h2>    <p>用户在别的wap网页上,产生了用户行为,用户数据,但是还没下载app,当用户下载app后,打算直接在app内延续之前在wap上的行为和数据的时候,就需要运用到跨越浏览器与app鸿沟的,互通方案。</p>    <h2>简单举个例子就是:</h2>    <p>用户在微信浏览器里,访问某个页面,感兴趣并且登陆了,然后引导下载了app,等用户下载完app后第一次打开,希望能自动就完成登陆,甚至同步下来一些刚才用户在wap页面上操作的数据</p>    <p>如果能发生跨浏览器与app的互通,除了这个case之外,还可以有更多地自由发挥,设计出更加舒畅的用户体验</p>    <p>想要实现这样目前看有2个方案,各自都有弊端,都不是完美的,本文会详细说明这两个方案</p>    <ul>     <li>设备指纹唯一识别方案</li>     <li>iOSSafariCookie互通方案</li>    </ul>    <p>本文相关link</p>    <p>iOS9下SafariCookie与app互通</p>    <p><a href="/misc/goto?guid=4959672988079014794" rel="nofollow,noindex">VKSafariDomainBridge Github</a></p>    <h2>设备指纹唯一识别方案</h2>    <p>如果用户在wap页面,能通过某种方式识别到唯一的设备标识,当用户离开去下载app,下载完成第一次打开app的时候,app能识别到一样的设备标识,那么就可以判断第一次打开app的用户,就是刚才浏览wap网页的用户,这样服务就可以把刚才wap上操作的数据结果,通过网络下发给app,从而让app实现,还原刚才wap的操作场景</p>    <p>这个过程大致如下</p>    <ul>     <li>用户在wap网页上产生了行为,产生了用户个人数据</li>     <li>wap网页收集了一种能够 唯一标识 设备的信息,并且发送给了服务器</li>     <li>app安装完毕后第一次运行,也去通过app尝试收集 唯一标识 设备的信息,并且发给服务器</li>     <li>服务器经过对比,发现app的 唯一标识 与wap网页发上来的 唯一标识 能够匹配</li>     <li>服务器判断,是同一个人操作,于是下发用户个人数据</li>    </ul>    <p>纵观整个流程发现,一切的核心,一切的关键,就是那个 唯一标示</p>    <p>这个 唯一标识 要具备太多太多的条件,想找到其实很不容易</p>    <ul>     <li>选择当做 唯一标识 的内容,必须能让app获取的到</li>     <li>选择当做 唯一标识 的内容,必须也能让wap获取的到</li>     <li>选择当做 唯一标识 的内容,还必须有能力区分出不同的设备,如果选的 唯一标识 好几个设备取出来的都一样,那么就乱套了</li>    </ul>    <p>那么我们看看遵循这几个条件,我们能选择啥?</p>    <ul>     <li>UDID,MAC地址啥的,别说wap了,app都不可能取到了</li>     <li>JS有好几套,通过网页渲染canvas的方案获取屏幕”指纹”,但这玩意app不可能拿到完全一致的东西,二者对不上,就没任何意义</li>     <li>IDFA,IDFV,这玩意app是能取到了,但是wap拿不到啊</li>    </ul>    <p>上面说的几个都是相对来说,如果能双方都拿到,是可以比较精准的进行设备 唯一标识 的,但问题是,我们拿不到。。怎么办?</p>    <p>看看下面几个数据</p>    <ul>     <li>设备屏幕尺寸(iOS设备如此的统一,一共就那么几个屏幕尺寸,重复的还不一堆一堆的)</li>     <li>设备操作系统(iOS系统碎片化如此的低,大部分几乎都升到较高级的系统版本,重复的依然一堆一堆)</li>     <li>设备IP(IP这玩意会变啊,离开WIFI进入3G,经常变,并且IP这玩意在同一WIFI下也重复的一堆一堆的啊)</li>     <li>访问时间(时间这玩意更没谱了,你们的用户量越大,某一个确定的时间段内,发生第一次安装,重复的就越多)</li>     <li>还有更多类似的数据</li>    </ul>    <p>发现没有,上面的数据最大的特点就是,有一定的描述设备体征的信息,但是如果只靠这一个描述信息,那结果就是重复的太多太多,根本没法确定一个唯一性。</p>    <p>但是,如果我们把这么些描述信息做成一个合集,同一时间内满足所有的条件,那么这个设备重复的概率一下就缩减了太多太多。</p>    <p>举个例子,到app安装完毕第一次打开的时候,所有访问过wap的设备信息,把他们的信息全都收集起来,找到同样的屏幕尺寸,同样的操作系统版本,同样的IP地址,访问时间相差不超过10min(暂定)的设备,在如此多得限定条件下,我们近乎可以认定为,是具有唯一性的设备,是同一个人</p>    <p>可以看到这里面众多的信息一起去过滤,比较强的过滤条件就是IP,但因为IP存在频繁变化,所以追加了时间条件,IP也可能因为WIFI路由器的原因导致,IP也存在重复和误伤,这时候,又辅助了简单的设备信息进行二次过滤。</p>    <p>这样我们就找到了一个并不完美的 唯一标识 ,有了这个唯一标识,就可以实现我们的跨浏览器和app的互通。</p>    <p>其实友盟的SDK就是这么做的</p>    <p><a href="/misc/goto?guid=4959672988180988748" rel="nofollow,noindex">友盟 SDK文档</a></p>    <p>友盟通过这个方法,知道了用户是从哪个网页看到的app下载的广告,然后发生的去appstore下载并运行的行为,从而有效的能核算广告的收益</p>    <p>a.通过对应用appstore URL进行封装,获取分渠道点击用户的相关信息,包括:时间、IP、设备类型、操作系统版本;</p>    <p>b.通过在应用中集成代码,获取初次打开应用的用户信息,包括:时间、IP、设备类型、操作系统版本;</p>    <p>c.实时对比不同渠道点击用户和应用激活用户信息,区分不同渠道带来的激活用户;</p>    <p>d.此统计方式不用媒介提供统计数据,实时自动对比,会存在一定误差,但可以基本衡量各渠道间及不同时期的渠道激活转化数据。</p>    <p>他有什么弊端吗?弊端还是挺明显的,因为他是不完美的 唯一标识 ,所以就存在着误伤。</p>    <p>什么是误伤?用户A浏览了WAP界面,用户B恰巧用同一屏幕,同一操作系统版本,同一网段出口IP,在既定时间内,B用户下载并运行了APP,这样我们这套方案,会把B识别成A,等到A真的下载完APP后再来运行,数据可能已经失效了</p>    <p>这种误伤是概率存在的,在现有的限定条件下,随着app的用户体量越来越大,这种误伤将会越来越明显。</p>    <p>来自: <a href="/misc/goto?guid=4959672988277658836" rel="nofollow">http://awhisper.github.io/2016/05/11/iOSBrowserDomainBridge/</a></p>