手机淘宝升级天猫app一点击淘宝升级天猫就自动打开天猫。就是某个app里面有个版本更新,有新的版本了,我点开让淘宝升级天猫

做对了这五件事,手机淘宝成就了日活破亿的超级APP--百度百家
做对了这五件事,手机淘宝成就了日活破亿的超级APP
分享到微信朋友圈
6年间,手机淘宝跳过什么坑,犯过哪些错,又做对了什么,才成就了一款日活用户近两亿的超级app?
2015年双十一,根据第三方调查 公司的数据显示,当天手机淘宝DAU(日活用户)高达1.89亿人。一款社交类app做到日活用户过亿都非易事,电商类app更是难上加难,但手机淘宝是 少有的例外。与微信上的闲聊不一样,1.89亿用户点开淘宝,贡献的可是真金白银。
以2013年阿里all in无线为始点,2年间,手机淘宝到底做对了什么,修正了什么,才成为一款日活用户过亿的超级app?
一,航空母舰的定位
手机淘宝的雏形,始于2010年淘宝无线事业部成立。但是最初两三年,手淘就是一个简单工具app,主要满足三类需求:搜索,购买,查物流,甚至没有导购、功能,当然更奢谈交流、互动。
手淘真正的涅槃之路,其实始于2013年。彼时担任阿里ceo的陆兆禧宣布了阿里的“all in”无线战略。
那时候,腾讯已经拿到了一张移动互联网的船票微信,阿里系尚未有一款app可以匹敌于劲敌微信,当时被认为pk微信的社交产品来往,其实在阿里系内部定位为一款试错的战术性产品,而真正担负重任的app,其实是手淘。
在all in无线的大战略里,手淘要从工具型app升级为平台性app,它被定义为一款堪称航空母舰的平台级app,除了天猫和聚划算等少数app之外,阿里其他app将成为依附于手淘的一个个战舰。
这种路径借鉴了阿里pc端的发展经验,后来的天猫、聚划算、淘宝旅行、支付宝等独立的产品,其实都是由淘宝孵化而来。如今,在移动端,手淘还能担当起如此重任吗?
疑虑犹存,但是定位清晰之后,至少战斗的方向终于清晰了。而且,聚焦之后,人才、资金、资源都往此倾斜,所有无线相关的预算和项目一律优先获批,成功率大大提高。
二:自我革命,超越pc
手淘的战略地位确立之后,和pc端的淘宝之前是什么关系,淘宝上的成功经验,到底哪些该继承,哪些该舍弃?手机淘宝如何超越pc淘宝?
pc端的淘宝网页,窗口足够大,货架上可以分门别类的摆放商品,一级类目多达二三十个,二级三级类目更是上百个,用户的选购方式是离不开搜索框,输入关键词后在长长的搜索结果里仔细寻找中意商品。但是手机的界面很小,这样的罗列类目肯定不合适。
手淘首页,到底该放什么,它们之间如何排列组合,以适配手机端的用户使用习惯?这个难题交到了青云手中。
首先,既然手淘是航母,那么各大战机app,比如天猫、聚划算、口碑外卖、天猫超市等药出现在首页,这块和pc端并无区别。
但是,但是类目排列方式却被青云舍弃了。如果说过去的淘宝是以商品为中心来设计网页,那么手淘则以用户为中心,比如,以中产白领崇尚的小众风格品为主的“有好货等”根据用户浏览购物习惯的“猜你喜欢”,把流量从5%提升到接近30%。
因此,手淘成功的第三条经验就是,敢于舍弃pc时代的成功经验,拓展移动互联网的新边界。
三,大数据和千人千面
当然,对于类似青云这样经验丰富的老兵来说,直觉是重要的,但是仅仅有直觉并不够,直觉还要靠精准翔实的数据来佐证或者修正。
2015年UED团队启动了“以数据驱动设计”计划,讲究所有的设计都必须有数据支持、有理有据。
例如,手淘上很受欢迎的百货家居建材频道“极有家”原本跳失率很高,UED团队发现用户 打开极有家之后,只看到各种家装美图,不知道这个频道做什么用,浏览到消费的转化率不高。发现这个问题后,设计师就在极有家首页上简单加了一排导览菜单, 标明“家具”“软饰”“建材”等区块,用户很快能认知到这是家装频道,就让用户的跳失率大幅降低。
大数据还让手淘实现了千人千面。比如,在手淘首页上的有好货、达人,猜你喜欢,每日好 店等,都是根据用户的使用习惯,实现了个性匹配。
大数据和千人千面,真正把pc淘宝时代的产品为中心,升级到了手淘的以用户为中心。
四,捆绑热门IP
在手机淘宝发展壮大的过程中,有一部分成绩当然要归功于淘宝的红利等等,但是,还有一个大招不得忽略,那就是捆绑热门ip的造势运动。
2015年,手淘最热门的ip大营销,就是手淘和哆啦a梦的合体。
为什么手淘要选择哆啦a梦呢?
首先,双方的气场气质契合。彼时,手机淘宝想塑造的品牌关键词如下:万能、快乐、年轻化、想象力、科技感。
再来看看多啦a梦这个超级ip的性格特征:未来、科技感、乐观,有梦想、好伙伴、智慧、勇气、温暖,这个形象与手机淘宝非常契合。
其次,要结合热点。2015年,手淘想吸引更多年轻用户,而彼时,恰逢哆啦a梦45周年,大型3d动画电影《哆啦a梦:伴我同行》上映,多啦a梦成为了当时最热门的ip,因此,此时捆绑哆啦a梦营销正当其时。
为了配合这一场营销盛典,手淘的界面变成了哆啦a梦的漫画形式,还配合了哆啦a梦真人电 影,入职淘宝、万能周等活动,这轮海陆空大轰炸效果显著, 针对90后的市场调研显示,此次战役针对90后人群到达率高并积累了较好的口碑;
第三,ip营销要与品牌和产品深度结合。以手淘为例,此次营销,配合了周边产品的上线,不仅提升了品牌知名度和美誉度,还带来了可观的交易量。
第四,多方共赢。一直以来,寻求多方共赢一直是作为平台的阿里成功的最重要经验,ip营销也是如此,经此一役,手淘、哆啦A梦、业务、产品、技术、商家都成为了赢家。
当然,手淘的热门ip跨界,不止一次,比如和熊本熊的合作等等。
五,手淘的未来:内容、社交、本地生活
六年的试错和摸索之后,超级app手淘未来要走向何方?
跳过许多坑、犯过许多错的淘宝,2016年的方向是内容化、社区化、本地生活服务化。
手淘做内容,听起来新鲜,但其实是个老业务,比如,从去年开始大热的网红概念,最初就来源于淘宝的淘女郎,比如,王思聪的新女友雪梨就是以淘宝店主和淘女郎的身份成为了网红。
去年,淘宝又提出了淘宝头条以及自品牌,再加上以前的社区、爱逛街、有好货、达人淘、微淘等,打的都是内容牌。
内容化将会帮淘品牌升级为自品牌。根据淘宝官方的解释,淘品牌诞生于PC时代,擅长低价推爆款,善于通过流量运营做促销;自品牌即个人就是一个渠道、一个品牌,它诞生于移动端,以90后卖家群体为主,他们更喜欢通过社区、社交方式运营用户和粉丝,提供个性化商品。
社区化则带着社交的基因,其实社区也一直在为电商行为助力。2015年手机淘宝就试水成功的“问大家”产品,就是在消费主路径中,揉入了社区基因,其对交易的转化效果显著。
本地生活,几乎是各大互联网公司在移动互联网时代最大的战场,过去,pc端只能卖实物产品为主,移动端则把线下的服务市场也连接到了互联网上。有了本地生活,手淘才能从购物平台升级为一站式的生活消费入口。
荣光都已成为历史,未来值得期待。
PS:更多文章欢迎关注微信订阅号财经故事会,微信号“caijinggushi”,也可扫描下述二维码。交流请加个人微信号“”,不过我比较内向,所以未必通过你的好友验证:)
分享到微信朋友圈
在手机阅读、分享本文
还可以输入250个字
推荐文章RECOMMEND
阅读:2901
阅读:25万
阅读:18万
阅读:15万
热门文章HOT NEWS
小米公司在北京召开发布会,发布了生态链品牌“MIJIA米家”,...
大佬鸣(丛硕鸣)的体育天地
姑婆那些事儿
牛老师商业评论
maomaobear
百度新闻客户端
百度新闻客户端
百度新闻客户端
扫描二维码下载
订阅 "百家" 频道
观看更多百家精彩新闻每次开启天猫app总是要登录,明明勾选自动登录,不知道怎么回事_百度知道
每次开启天猫app总是要登录,明明勾选自动登录,不知道怎么回事
应该期间电脑登陆猫猫能保持终端登陆电脑登陆候app自线再打候需要再登陆手机ios系统没越狱基本面原行卸载重新装安卓系统手机能原比较能安全管理软件禁止自登陆或者app更新权限设置发变化没发现
其他类似问题
为您推荐:
天猫的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁App升级时数据库的迁移更新 - 简书
下载简书移动应用
写了8295字,被211人关注,获得了284个喜欢
App升级时数据库的迁移更新
前一段时间在进行App升级的时候,由于一开始版本初期没有考虑完善,导致走了很多弯路,后来经过自己的一些思考,总结出了一些在app升级的时候,数据库内文件同步保持更新的经验,希望能给大家带来帮助.
总体方案及思路
在每一次运行程序的时候,判断是否存在数据库,如果不存在则直接创建数据库,若存在取出数据库版本号进行其他的处理.
,当用户第一次下载安装app的时候,第一次建立版本库,将我们的数据信息存入数据库中,同时保存一个当前版本号加一的字段到数据库中.
那么问题来了,为什么我们需要将版本信息加一呢,这是为了以后进行版本判断的时候更加方便.
还有一个问题,为什么我们将版本信息放入数据库而不使用UserDefaults快速存储呢?原因是你需要考虑到
当你的app有不同的用户登录时,UserDefaults是所有数据共享的,你不能根据不同的用户来处理他的信息
判段他的信息是否需要更新
当用户更新app的时候,会直接从数据库中取出上一次保存的版本字段,例如是2.0版本的时候,会直接从case2开始执行,修改完数据结构以后,再一次将版本字段存到数据库中.
所以每更新一次版本,如果数据结构信息有变动的时候,直接在后面加case语句即可.
下面是一些参考代码,使用FMDB库:
1.当没有数据库存在的时候,创建数据库 然后执行版本1的创建(创建版本表,创建信息表),保存1.0+1.0信息到版本库,数据库内版本号为2.0
2.当有数据库存在的时候,执行判断版本库的版本信息,版本号赋值给dbVersion,然后进行信息的更新,同时更新版本号的更新
-(instancetype)init
//设置数据库版本为1
int dbVersion = 1;
if (self = [super init]) {
//判断本地有没有数据库文件
if (![self isExistDB]) {
//不存在 初始化数据库
[self createDB];
//如果存在,那么获取版本信息
_dataBase = [[FMDatabase alloc] initWithPath:[self getDBPath]];
NSString * currentVersion = [self getDBInfoValue];
dbVersion = currentVersion.intV
switch (dbVersion) {
//判断版本信息
//说明用户第一次安装
//创建版本表
[self excuteLocalSql:createTB_info];
//创建信息表
[self excuteLocalSql:create_tusersql];
//保存1.0+1.0信息到数据库
用于下一次判断版本号
[self setDBInfoValueWithString:@"2.0"];
//更新信息表
[self excuteLocalSql:update_tusersql];
//保存2.0+1.0到数据库
[self setDBInfoValueWithString:@"3.0"];
[self excuteLocalSql:modify];
[self setDBInfoValueWithString:@"4.0"];
使用的方法:
//使用的SQL语句
NSString *createTB_info=@"create table if not exists t_info (version text)";
NSString *create_tusersql = @"CREATE TABLE IF NOT EXISTS T_User (userid INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, username TEXT, usergender TEXT, usercreatetime date, userupdatetime date,age INTEGER,islogined INTEGER)";
NSString * update_tusersql = @"alter table T_User
column useraddress TEXT";
NSString *modify=@"alter table T_User add column password text not null default '111111'";
//判断是否存在数据库
-(BOOL)isExistDB
NSFileManager *fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:[self getDBPath]];
//得到路径
-(NSString *)getDBPath
return [NSString stringWithFormat:@"%@/Documents/user1.sqlite",NSHomeDirectory()];
#pragma mark - 更新版本号
-(BOOL)updateVersionInfoWithString:(NSString *)version
NSString *sql = @"UPDATE t_info SET version = ?";
BOOL b = [_dataBase executeUpdate:sql,version];
#pragma mark - 插入版本号
-(BOOL)insertVersionInfoWithString:(NSString *)version
NSString *sql = @"INSERT INTO t_info(version) VALUES(?)";
BOOL b = [_dataBase executeUpdate:sql,version];
#pragma mark - 创建版本信息
- (BOOL)setDBInfoValueWithString:(NSString *)string
if ([self getDBInfoValue]) {
//更新版本
[self updateVersionInfoWithString:string];
//插入版本
[self insertVersionInfoWithString:string];
return YES;
//得到版本信息
- (NSString *)getDBInfoValue
NSString *sql = @"select version from t_info";
需要先打开数据库
[_dataBase open];
FMResultSet *resultSet = [_dataBase executeQuery:sql];
NSString * version =
while ([resultSet next]) {
version = [resultSet stringForColumn:@"version"];
#pragma mark - 创建数据库中的表
- (BOOL)excuteLocalSql:(NSString *)createTB_info
BOOL b = [_dataBase executeUpdate:createTB_info];
NSLog(@"表的创建结果:%d",b);
#pragma mark - 初始化数据库
- (void)createDB
_dataBase = [[FMDatabase alloc] initWithPath:[self getDBPath]];
if (_dataBase.open == YES) {
NSLog(@"数据库成功创建!");
NSLog(@"创建失败!");
如果觉得对自己有帮助的话,请点赞噢!有什么疑问和问题可以直接私信我.
打赏的多少无所谓,重要的是您对我的支持,真心感谢!
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
被以下专题收入,发现更多相似内容:
简书程序员大本营
投稿须知:
1.本专题仅收录与程序有关的文章。
2.请在代码框里写代码,尽量保证可看性。
· 71093人关注
分享 iOS 开发的知识,解决大家遇到的问题,讨论iOS开发的前沿,欢迎大家投稿~
· 15215人关注
· 2939人关注
打赏的多少无所谓,重要的是您对我的支持,真心感谢!
选择支付方式:今天看啥 热点:
Android实现APP自动更新功能
现在一般的android软件都是需要不断更新的,当你打开某个app的时候,如果有新的版本,它会提示你有新版本需要更新。该小程序实现的就是这个功能。
该小程序的特点是,当有更新时,会弹出一个提示框,点击确定,则在通知来创建一个进度条进行下载,点击取消,则取消更新。
以下是详细代码:
1.创建布局文件notification_item.xml,用于在通知栏生成一个进度条和下载图标。
2.创建AppContext类,该类继承自Application。
package com.test.
import android.app.A
import android.content.C
import com.test.update.config.C
public class AppContext extends Application {
private static AppContext appI
public static AppContext getInstance() {
return appI
public void onCreate() {
// TODO Auto-generated method stub
super.onCreate();
appInstance =
context = this.getBaseContext();
// 获取当前版本号
PackageInfo packageInfo = getApplicationContext()
.getPackageManager().getPackageInfo(getPackageName(), 0);
Config.localVersion = packageInfo.versionC
Config.serverVersion = 1;// 假定服务器版本为2,本地版本默认是1
} catch (NameNotFoundException e) {
e.printStackTrace();
initGlobal();
public void initGlobal() {
Config.localVersion = getPackageManager().getPackageInfo(
getPackageName(), 0).versionC // 设置本地版本号
Config.serverVersion = 2;// 假定服务器版本为2,本地版本默认是1--实际开发中是从服务器获取最新版本号,android具体与后端的交互见我另///外的博文
} catch (Exception ex) {
ex.printStackTrace();
3.创建配置文件类Config.java,在这个类里面定义一些与版本相关的常量
package com.test.update.
public class Config {
//版本信息
public static int localVersion = 0;
public static int serverVersion = 0;
/* 下载包安装路径 */
public static final String savePath = /sdcard/test/;
public static final String saveFileName = savePath + test.
4.编写更新服务类UpdateServcie.java
package com.test.
import java.io.F
import java.io.FileOutputS
import java.io.InputS
import java.net.HttpURLC
import java.net.URL;
import android.annotation.SuppressL
import android.app.N
import android.app.NotificationM
import android.app.PendingI
import android.app.S
import android.content.I
import android.net.U
import android.os.E
import android.os.H
import android.os.IB
import android.os.M
import android.widget.RemoteV
import com.test.update.config.C
public class UpdateService extends Service {
private int titleId = 0;
// 文件存储
private File updateDir =
private File updateFile =
// 下载状态
private final static int DOWNLOAD_COMPLETE = 0;
private final static int DOWNLOAD_FAIL = 1;
private NotificationManager updateNotificationManager =
private Notification updateNotification =
// 通知栏跳转Intent
private Intent updateIntent =
private PendingIntent updatePendingIntent =
* 创建通知栏
RemoteViews contentV
// 这样的下载代码很多,我就不做过多的说明
int downloadCount = 0;
int currentSize = 0;
long totalSize = 0;
int updateTotalSize = 0;
// 在onStartCommand()方法中准备相关的下载工作:
@SuppressWarnings(deprecation)
public int onStartCommand(Intent intent, int flags, int startId) {
// 获取传值
titleId = intent.getIntExtra(titleId, 0);
// 创建文件
if (android.os.Environment.MEDIA_MOUNTED.equals(android.os.Environment
.getExternalStorageState())) {
updateDir = new File(Environment.getExternalStorageDirectory(),
Config.saveFileName);
updateFile = new File(updateDir.getPath(), getResources()
.getString(titleId) + .apk);
this.updateNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
this.updateNotification = new Notification();
// 设置下载过程中,点击通知栏,回到主界面
updateIntent = new Intent(this, UpdateActivity.class);
updatePendingIntent = PendingIntent.getActivity(this, 0, updateIntent,
// 设置通知栏显示内容
updateNotification.icon = R.drawable.ic_
updateNotification.tickerText = 开始下载;
updateNotification.setLatestEventInfo(this, QQ, 0%,
updatePendingIntent);
// 发出通知
updateNotificationManager.notify(0, updateNotification);
// 开启一个新的线程下载,如果使用Service同步下载,会导致ANR问题,Service本身也会阻塞
new Thread(new updateRunnable()).start();// 这个是下载的重点,是下载的过程
return super.onStartCommand(intent, flags, startId);
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
@SuppressLint(HandlerLeak)
private Handler updateHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case DOWNLOAD_COMPLETE:
// 点击安装PendingIntent
Uri uri = Uri.fromFile(updateFile);
Intent installIntent = new Intent(Intent.ACTION_VIEW);
installIntent.setDataAndType(uri,
application/vnd.android.package-archive);
updatePendingIntent = PendingIntent.getActivity(
UpdateService.this, 0, installIntent, 0);
updateNotification.defaults = Notification.DEFAULT_SOUND;// 铃声提醒
updateNotification.setLatestEventInfo(UpdateService.this,
QQ, 下载完成,点击安装。, updatePendingIntent);
updateNotificationManager.notify(0, updateNotification);
// 停止服务
stopService(updateIntent);
case DOWNLOAD_FAIL:
// 下载失败
updateNotification.setLatestEventInfo(UpdateService.this,
QQ, 下载完成,点击安装。, updatePendingIntent);
updateNotificationManager.notify(0, updateNotification);
stopService(updateIntent);
public long downloadUpdateFile(String downloadUrl, File saveFile)
throws Exception {
HttpURLConnection httpConnection =
InputStream is =
FileOutputStream fos =
URL url = new URL(downloadUrl);
httpConnection = (HttpURLConnection) url.openConnection();
httpConnection
.setRequestProperty(User-Agent, PacificHttpClient);
if (currentSize & 0) {
httpConnection.setRequestProperty(RANGE, bytes=
+ currentSize + -);
httpConnection.setConnectTimeout(10000);
httpConnection.setReadTimeout(20000);
updateTotalSize = httpConnection.getContentLength();
if (httpConnection.getResponseCode() == 404) {
throw new Exception(fail!);
is = httpConnection.getInputStream();
fos = new FileOutputStream(saveFile, false);
byte buffer[] = new byte[4096];
int readsize = 0;
while ((readsize = is.read(buffer)) & 0) {
fos.write(buffer, 0, readsize);
totalSize +=
// 为了防止频繁的通知导致应用吃紧,百分比增加10才通知一次
if ((downloadCount == 0)
|| (int) (totalSize * 100 / updateTotalSize) - 10 & downloadCount) {
downloadCount += 10;
updateNotification.setLatestEventInfo(UpdateService.this,
正在下载, (int) totalSize * 100 / updateTotalSize
+ %, updatePendingIntent);
* 在这里我们用自定的view来显示Notification
updateNotification.contentView = new RemoteViews(
getPackageName(), R.layout.notification_item);
updateNotification.contentView.setTextViewText(
R.id.notificationTitle, 正在下载);
updateNotification.contentView.setProgressBar(
R.id.notificationProgress, 100, downloadCount, false);
updateNotificationManager.notify(0, updateNotification);
} finally {
if (httpConnection != null) {
httpConnection.disconnect();
if (is != null) {
is.close();
if (fos != null) {
fos.close();
return totalS
class updateRunnable implements Runnable {
Message message = updateHandler.obtainMessage();
public void run() {
message.what = DOWNLOAD_COMPLETE;
// 增加权限;
if (!updateDir.exists()) {
updateDir.mkdirs();
if (!updateFile.exists()) {
updateFile.createNewFile();
// 下载函数,以QQ为例子
// 增加权限;
long downloadSize = downloadUpdateFile(
http://softfile.:8080/msoft/179//MobileQQ1.0(Android)_Build0198.apk,
updateFile);
if (downloadSize & 0) {
// 下载成功
updateHandler.sendMessage(message);
} catch (Exception ex) {
ex.printStackTrace();
message.what = DOWNLOAD_FAIL;
// 下载失败
updateHandler.sendMessage(message);
5.编写活动类UpdateActivity
package com.test.
import com.test.update.config.C
import android.support.v4.app.F
import android.app.A
import android.app.AlertD
import android.content.DialogI
import android.content.I
import android.os.B
import android.util.L
import android.view.LayoutI
public class UpdateActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
checkVersion();
* 检查更新版本
public void checkVersion() {
if (Config.localVersion & Config.serverVersion) {
Log.i(hgncxzy, ==============================);
// 发现新版本,提示用户更新
AlertDialog.Builder alert = new AlertDialog.Builder(this);
alert.setTitle(软件升级)
.setMessage(发现新版本,建议立即更新使用.)
.setPositiveButton(更新,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
// 开启更新服务UpdateService
// 这里为了把update更好模块化,可以传一些updateService依赖的值
// 如布局ID,资源ID,动态获取的标题,这里以app_name为例
Intent updateIntent = new Intent(
UpdateActivity.this,
UpdateService.class);
updateIntent.putExtra(titleId,
R.string.app_name);
startService(updateIntent);
.setNegativeButton(取消,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog,
int which) {
dialog.dismiss();
alert.create().show();
// 清理工作,略去
// cheanUpdateFile()
6.添加权限以及将服务静态加载(在配置文件中加载)。
相关搜索:
相关阅读:
相关频道:
Android教程最近更新}

我要回帖

更多关于 天猫魔盒升级 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信