基于用户类型调起不同类型浏览器窗口的一种方案

原创 2016年05月31日 20:09:15

基于用户类型调起不同类型浏览器窗口的一种方案

根据近期的卖家模式一个需求,做一个小总结。

背景

标题有点绕,让我慢慢道来。先把需求大概说一下。
当用户千牛或者旺旺外链调起窗口的时候,根据用户的身份打开不同的窗口。如果是卖家就打开卖家窗口,否则打开普通窗口。
旺旺或者千牛外链打开网页,若用户为淘宝或者阿里卖家则在卖家窗口中打开网页,否则就在普通窗口中打开网页。

用户类型有哪些?这里把用户分为两类,一类是淘宝、1688卖家,另一类是其他用户。

不同类型的浏览器窗口指的是什么?对于UC浏览器PC版而言,不同类型浏览器窗口指的是普通窗口以及卖家窗口。

所有外链调起都这样做吗?仅仅是千牛以及旺旺外链。

方案

千牛外链直接调起卖家窗口的逻辑

首先看一下如果不区分用户,千牛外链直接调起卖家窗口的逻辑

通过类StartupBrowserCreatorImpl中的方法ProcessLaunchURLs()创建出一个browser,并初始化。
而类ProfilePartitionLauncher则选择外链所对应的browser。StartupBrowserCreatorImpl创建一个ProfilePartitionLauncher对象,
这个对象绑定到合适的browser中。

StartupBrowserCreatorImpl在ProcessLaunchURLs里解析待打开的URL,它依赖ProfilePartitionLauncher来完成外链或者快捷方式的解析工作。解析完标识数据之后,流程分成两步:

1、从Local State文件中查询并补全小号的标识信息,这部分逻辑由PartitionSession封装。
2、解析已存储的小号详细信息,比如上次未关闭的标签页,这部分逻辑由ProfilePartitionResolver封装,而且是异步的过程。

这里解释一下分两步走的必要性,启动流程是非常影响开启速度的部分,任何耗时的操作都会恶化用户体验,这里步骤1从Local State文件里查询小号的标识信息,虽然是同步的,但是数据量很小,而且是在Local State文件加载之后的流程,性能影响姑且可忽略。至于步骤2,解析小号存储的详细信息,目前只存储了上次未关闭的标签页,这部分数据量就已经偏大,而且随着以后功能的增加,还需要存储别的数据(比如书签),因此,这里有必要做成异步的。

基于用户类型调起不同类型窗口的逻辑

在千牛外链打开卖家窗口的基础上,这里加上了使用千牛外链的用户的身份判断。若用户为卖家则打开卖家窗口,否则打开普通窗口。

ProfilePartitionLauncher来完成外链或者快捷方式的解析工作,并将解析的结果交由对象PartitionAccountInfoProvider来判断用户身份,进而打开窗口。

相比于千牛外链直接打开卖家窗口,此处做了以下处理:

1、ProfilePartitionLauncher对外链进行解析后,将是否为千牛外链调起反馈给StartupBrowserCreatorImpl的ProcessLaunchURLs方法。如果不是千牛外链则按照原有逻辑打开窗口。
由于数据量较小,这块判断对性能影响较小。
2、如果ProfilePartitionLauncher对外链解析为千牛外链调起,则延后browser启动,在ProfilePartitionLauncher中打开窗口。需求决定打开窗口与用户类型相关,从而先通过PartitionAccountInfoProvider来判断用户身份,而StartupBrowserCreatorImpl生命周期较短,必须回调到ProfilePartitionLauncher打开相应的窗口。由于不能过分的延时加载,在PartitionAccountInfoProvider中设定时间阈值,如果超时默认打开普通窗口。

总结

基于用户类型打开窗口实际上对浏览器打开窗口逻辑改动较大,对其性能影响也较大。后续需要改进的点实际上有很多。

1、基于用户类型打开窗口,需要在打开窗口前查询用户类型,这实际上大大的延长了打开窗口的时延。可以将用户类型存在本地,第一次需要查询接口,以后就直接查询本地的数据得到用户身份信息。

2、可以在配置上加上这个功能的开关,如果线上反应不好可以很快的关掉这个功能,而不是通过发客户端版本解决。

HTML 表单用于搜集不同类型的用户输入

表单标签 标签 描述 定义供用户输入的表单 定义输入域 定义文本域 (一个多行的输...
  • GuXAiXia
  • GuXAiXia
  • 2017年05月25日 16:17
  • 326

重定义;不同的基类型

重定义;不同的基类型 编译某些源码时  可能遇到这个问题 ; 如下图 : 解决办法 : 在出问题的源码部分 添加  #ifndef _MSC_VER ...
  • qq_33775402
  • qq_33775402
  • 2017年02月06日 22:27
  • 4698

算法的封装与切换——策略模式(一):电影票打折方案

俗话说:条条大路通罗马。在很多情况下,实现某个目标的途径不止一条,例如我们在外出旅游时可以选择多种不同的出行方式,如骑自行车、坐汽车、坐火车或者坐飞机,可根据实际情况(目的地、旅游预算、旅游时间等)来...
  • Mark_LQ
  • Mark_LQ
  • 2015年07月16日 15:36
  • 1307

不同数据类型的相互转换

不同数据类型的相互转换 首相强调一下那个关于各类型数值的长度以及取值范围的表格十分重要,必须附上:类型 关键字 长度(位) ...
  • LingXi__Y
  • LingXi__Y
  • 2016年07月28日 12:47
  • 1836

基于用户的协同过滤推荐算法

转自   http://www.open-open.com/lib/view/open1416387729742.html 阅读目录 什么是推荐算法推荐算法的条件基于用户的协同...
  • winone361
  • winone361
  • 2015年10月19日 10:41
  • 719

tomcat中的管理领域,角色和用户

主要在tomcat的conf/server.xml文件和web应用程序中的web-inf/web.xml文件中的配置 tomcat含有可插入式的领域架构,并具备几种有用的领域实现:UserDataba...
  • cyforever_cool
  • cyforever_cool
  • 2013年11月21日 20:33
  • 1401

VS2008 “重定义;不同的基类型”

在VS2008下编译C++程序,出现了错误“重定义”
  • u011986223
  • u011986223
  • 2014年04月08日 14:48
  • 5571

(二)数组是一种数据类型

我们都知道,数组是编程语言中最常见的数据结构,数据要求所有的数组元素具有相同的数据类型,即一个数组里只能存储一种数据类型的数据,而不能存储多种数据类型的数据。 值得指出的是,也是本篇着重提出的一点是...
  • m0_37630602
  • m0_37630602
  • 2017年04月13日 08:51
  • 305

vector是同一种类型的对象的集合

vector是同一种类型的对象的集合,每个对象有一个对应的整数索引值,也可称为一种容器。   vector是一个类模板。   vector一个重要特性,vector对象动态增长,运行时高效的添加元...
  • u012402926
  • u012402926
  • 2015年10月22日 16:24
  • 790

不同类型的指针的区分与应用

指针的初始化: [存储类型] 数据类型 *指针变量名 [=初始值];如int*p=NULL; 指针类型 int* ;       基(础)类型int;  指针指向的地方就是指针变量的值&x;地址类型v...
  • NoDistanceY
  • NoDistanceY
  • 2016年03月20日 14:42
  • 755
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:基于用户类型调起不同类型浏览器窗口的一种方案
举报原因:
原因补充:

(最多只允许输入30个字)