简单逆向天猫的思考

多Tab应用App使用中,第一个实质页面的呈现速度和操作体验,极大影响了用户使用欲望和整体评价。对于电商App而言,首页更直接关联商品推介和订单转化。所有页面中,首页使用频率最高,停留时间最长,极致优化良好布局App首页是收益极高的任务。
    笔者从UI和代码等多切点分析天猫iPhone App首页,在一定程度内复现编码逻辑 。使用了网络抓包、沙盒目录分析、reveal 视图层次、dump类头文件、IDA内存寻址、LLDB越狱联调等方式,将获得信息简单筛选梳理,希望能对应用开发的童鞋有稍许帮助或者参考意义。

一、架构级服务支持
    1.图片缓存,全权托管SDWebImageCache。SDWebImageCache在体验和性能上都有很好的优化,并得到长期开源维护。
    2.HotFix,使用了服务器下发JSPatch文件的方式,但不依赖JSPatch三方库。JSPatch大约1600行OC和90行JS代码,提供了核心功能。
    3.Hybrid,预加载H5全站至沙盒,从而能快速从Native切换至WebApp,在重大活动时可以实时监控和维护界面而不至Crash。
    4.营销支持,每个顶级Native View所在VC,均在屏幕外实例化WVWebView(计划替换UCWebView中),以执行类似红包雨等营销活动。
    5.数据本地持久化,切合Cache、Perference、Library、tmp、Document各沙盒目录特性。

二、数据源策略对用户体验的影响
    先以这样一个前提条件为基础:首页的布局变动需要经过市场调研,给出充足理由;否则在很长一段时间内,首页的布局都是轻微或者基本不变化的。
     从这个前提出发,天锚首页采用了这样的策略:1.用户新安装App时有预置数据;2.优先本地数据实例化UI组件和初步绘制;3.服务器数据到达后重新绘制;4.完成一次服务器请求,变动的布局文件被持久化,以供下次打开时用最新布局;5.由于新布局可能在灰度测试中,新布局不一定存放至持久化存储位置(NCPersitentxxx),但会存到至另外一处(Preference)并优先使用。
    
    首页的绘制降低对服务器数据返回的必然依赖,是目前大部分流行App的数据绘制选择。有这样几个好处:1.增加信息推介机会。用户在断网情况下也能浏览主页,至少能浏览商品目录树,如有图片缓存可获更多信息; 2.优化界面呈现速度。等待网络过程中,可以完成所有对象的实例化与绘制(天猫首页并没有重用此时实例化的对象或绘制,在网络数据返回后,将重复一遍实例化和绘制过程。但各实例有canReuse属性以支持重用);3.提高用户体验。不需要在首页弹出交互打断的AlertController,实际上大部分App断网时不会在首页弹出Alert或只有空白页。

根据这些情况主要测试几个场景:1. 新安装,断网运行 ;  2.非新安装,断网运行,未清理Cache;3.非新安装,断网运行,已清理Cache;  4. 断网运行,其它页面网络恢复,切回首页;5.正常运行。
    场景1、3,天猫为空目录,但能看目录树;2有图片和目录;1为持久化布局,2和3可能是新布局,也可能是持久化布局;4图片自动加载,布局需手动刷新。

三、用ScrollView来实现一个lazilyScrollView的必要
    大部分APP的首页为了简便起见,使用了tableView+collectionView的主要布局,然而这都是很重的控件,尤其是collectionView。如果从这个考虑,减少视层图级出发,实现一个lazilyScrollView是有必要的,也是天猫首页的选择。
    
    而如何实现,使得更tableView一样有新入屏重用,出屏释放,需要设计和考虑的东西还是很多的。而lazilyScrollView正是天猫首页UI实现的精髓所在。
    希望能在近期内忠实的复现,然而很多属性的用途,众多方法的调用顺序,还是需要猜测和汇编验证的,加油!

时间: 2024-10-13 07:08:54

简单逆向天猫的思考的相关文章

"简单设计"的一点思考

简单设计是Xp技术实践中开发实践的核心实践,“简单也是价值观中智力色彩最强烈的”,然而,提到简单设计,大家更觉得像原则或者价值观,感觉上还是比较泛,我们不妨从下面的几个角度看一下  1. 为什么要简单设计 <1>. 简单的代码更容易读懂. <2>. 好的设计更能应对变化.  这两点是基于成本和收益考虑的,这里的价值是时间及金钱.更快的满足需求,减少复杂带来的故障排查.修复成本,代码大量修改或者重写成本.  2. 什么是简单设计 对一个团队来讲,简单设计就是团队中每个人都能轻松的读懂

乔布斯成功的简单秘方,坚持思考两个问题

原文地址:http://www.aipingce.com/article-22939-1.html 乔布斯的成功秘方很简单, 他的成功和固执均来自于此. 创造不是才华.潜意识和机会的产物,而是思考的结果,是一系列对于问题和解决方案的重复思考过程.最好的解决方案往往能解开大部分难题,这结论早就在 1930 年代被心理学家 Karl Duncker 记录下来: “…行动就是有目标并且有计划的一串动作.这是一种没有‘定义’的结 构,是人类最基本最原始的经验.比如这些问题,‘Why doesn’t it

简单逆向第一弹

(原创内容,禁止转载) 之前大致了解过PE格式.ELF格式.COFF格式以及内存布局和栈的布局,这次直接实战反编译. 参考书籍:1.0day安全:软件漏洞分析技术 2.IDA PRO 权威指南 首先搭建开发环境:虚拟机安装系统Windows XP SP2 ,安装VC++6.0,安装ollydbg和IDA PRO 主机:Linux,安装dumpbin.objdump.nidisasm和ditorm(后三个暂时用不上) 一:开发一个简单的C语言程序,主要逻辑是简单验证(本次的目的就是突破这种验证限制

《iOS用户体验》总结与思考-改动版

假设转载此文.请注明出处:http://blog.csdn.net/paulery2012/article/details/25157347,谢谢. 前言: 本文是在阅读<ios用户体验>的过程中,记录的总结和个人的感受思考.不免有错误之处,恳请读者指正,在以下留言就可以. 第一章:ios人机界面指南概述 1.智能手机的特点:大尺寸.高分辨率.强大的计算能力 2.签名交互:滚动轮.导航键.按键和硬键盘.软键盘.触控笔.触屏.输入特性又被称为"签名交互",用户能够通过输入方式

IDA Pro逆向实战之Crackme(简单篇)

今天手闲的很,没事就拿出了以前没解决的逆向题来做一下,具体的源程序在附件里,废话少说,直接上菜: 0.   源程序运行效果(输入不对的,直接退出): Exeinfo PE 查壳: 看到是无壳的小程序,看来练手一定会很容易!!!那接下来直接载入到IDA中看看程序执行逻辑吧! IDA Pro 查看程序执行逻辑 这里截的是一张白图,不过对于分析程序流程已经足够了,顺便解释下图里的红线是False分支执行的,绿线是True分支执行的,大致看下这里的分支不是很多,所以这个程序逆起来应该不是很复杂! 3.

思考与实践的节奏

一般来说,当我们学习某一个领域里面的知识的时候,我们更多做的事情是跟着“某个人”(比如某书的作者)来学习这个领域里面众多的概念和这些概念之间的关系,清楚了概念和关系之后,再进行练习和实践. 即使学习的再好,如果不练习不实践,这些知识也是没有用处的. 那么,上面的学习方式有没有什么问题呢? 答案是肯定的,问题就在于我们探究领域里面概念之间关系的方式错误了,我们不应该只按照作者限定的思路去接触关系,而是应该从wishfull thinking的角度提出问题(或者说是一些问题的例子),通过解决这些一个

最近的一点思考,关于高手/大师/学霸

最近重新学习线代,微积分,概率论.大学的时候就没有好好学过,觉得概念,公式太多,而且很多难以理解. 而我自己一直认为数学能力还是不错的.但是到大学以后,觉得完全跟不上,和边上的人交流,包括学生和工作以后的人交流,完全就没几个人能高明白高数在讲什么,线性变化是什么.一度我认为自己不擅长高等数学了. 而一些半桶水,也在推波助澜,各种炫技. 直到最近我看了3blue1brown的一个外国人的视频. 发现原来很复杂的线性代数,其根本原理就是向量的线性变换. 后面线代讲的一切都是以这个为原点的. 很多时候

Python实现简单的梯度下降法

Python 实现简单的梯度下降法 机器学习算法常常可以归结为求解一个最优化问题,而梯度下降法就是求解最优化问题的一个方法. 梯度下降法(gradient descent)或最速下降法(steepest decent),是求解无约束最优化问题的一种最常用的方法. 梯度下降法实现简单,是一种迭代算法,每一步会求解目标函数的梯度向量. 本文分为理论和 Python 代码实践,希望实现简单的梯度下降法,相关代码已放在 GitHub 中. 理论 问题定义 那么什么是目标函数,在机器学习中这常常是一个损失

ENode框架Conference案例分析系列之 - 上下文划分和领域建模

前面一片文章,我介绍了Conference案例的核心业务,为了方便后面的分析,我这里再列一下: 业务描述 Conference是这样一个系统,它提供了一个在线创建会议以及预订会议座位的平台.这个系统的用户有两类:1)客户,可以创建和管理会议:2)会议座位预定者,可以预订会议座位.具体的关键业务描述如下: 客户创建一个会议,并录入会议的基本信息,比如名称.时间段.地点,等:会议创建后,系统会为客户自动生成一个AccessCode,客户可以通过AccessCode访问自己创建的会议: 客户定义某个会