Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
言程序plus
uni-starter
提交
a921045c
U
uni-starter
项目概览
言程序plus
/
uni-starter
与 Fork 源项目一致
Fork自
DCloud / uni-starter
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-starter
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
a921045c
编写于
4月 13, 2021
作者:
L
linju
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
21
上级
14d1d150
变更
12
隐藏空白更改
内联
并排
Showing
12 changed file
with
844 addition
and
724 deletion
+844
-724
.gitignore
.gitignore
+2
-1
manifest.json
manifest.json
+3
-3
pages/ucenter/edit/uploadCutImageToUnicloud.vue
pages/ucenter/edit/uploadCutImageToUnicloud.vue
+1
-1
uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/config.json
.../uni-id/uniCloud/cloudfunctions/common/uni-id/config.json
+0
-52
uni_modules/uni-quick-login/components/uni-quick-login/uni-quick-login.vue
...uick-login/components/uni-quick-login/uni-quick-login.vue
+4
-1
uni_modules/uni-upgrade-center-app/changelog.md
uni_modules/uni-upgrade-center-app/changelog.md
+9
-0
uni_modules/uni-upgrade-center-app/package.json
uni_modules/uni-upgrade-center-app/package.json
+79
-79
uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue
uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue
+486
-442
uni_modules/uni-upgrade-center-app/readme.md
uni_modules/uni-upgrade-center-app/readme.md
+70
-69
uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version/check-version.param.json
...oud/cloudfunctions/check-version/check-version.param.json
+1
-1
uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version/index.js
...center-app/uniCloud/cloudfunctions/check-version/index.js
+34
-4
uni_modules/uni-upgrade-center-app/utils/check-update.js
uni_modules/uni-upgrade-center-app/utils/check-update.js
+155
-71
未找到文件。
.gitignore
浏览文件 @
a921045c
unpackage/
.hbuilderx
node_modules
.DS_Store
\ No newline at end of file
.DS_Store
uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/config.json
\ No newline at end of file
manifest.json
浏览文件 @
a921045c
...
...
@@ -77,15 +77,15 @@
"oauth"
:
{
"apple"
:
{},
"weixin"
:
{
"appid"
:
"wx
0411fa6a39d61297
"
,
"appsecret"
:
""
,
"appid"
:
"wx
ffdd8fa6ec4ef2a0
"
,
"appsecret"
:
"
6c9119430d7be0a147bcbbb73ef33acf
"
,
"UniversalLinks"
:
"https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
},
"univerify"
:
{}
},
"share"
:
{
"weixin"
:
{
"appid"
:
"wx
0411fa6a39d61297
"
,
"appid"
:
"wx
ffdd8fa6ec4ef2a0
"
,
"UniversalLinks"
:
"https://static-76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e.bspapp.com/uni-universallinks/__UNI__03B096E"
,
"_spaceID"
:
"76ce2c5e-31c7-4d81-8fcf-ed1541ecbc6e"
}
...
...
pages/ucenter/edit/uploadCutImageToUnicloud.vue
浏览文件 @
a921045c
<
template
>
<view
class=
"content"
>
<limeClipper
:width=
"options.width"
:scale-ratio=
"2"
:is-lock-width=
"
true"
:is-lock-height=
"tru
e"
:height=
"options.height"
:image-url=
"path"
<limeClipper
:width=
"options.width"
:scale-ratio=
"2"
:is-lock-width=
"
false"
:is-lock-height=
"fals
e"
:height=
"options.height"
:image-url=
"path"
@
success=
"successFn"
@
cancel=
"cancel"
/>
</view>
</
template
>
...
...
uni_modules/uni-id/uniCloud/cloudfunctions/common/uni-id/config.json
已删除
100644 → 0
浏览文件 @
14d1d150
{
"passwordSecret"
:
"passwordSecret-demo"
,
"tokenSecret"
:
"tokenSecret-demo"
,
"tokenExpiresIn"
:
7200
,
"tokenExpiresThreshold"
:
600
,
"passwordErrorLimit"
:
6
,
"bindTokenToDevice"
:
true
,
"passwordErrorRetryTime"
:
3600
,
"autoSetInviteCode"
:
false
,
"forceInviteCode"
:
false
,
"app-plus"
:
{
"tokenExpiresIn"
:
2592000
,
"oauth"
:
{
"weixin"
:
{
"appid"
:
"wx0411fa6a39d61297"
,
"appsecret"
:
"6c9119430d7be0a147bcbbb73ef33acf"
},
"apple"
:
{
"bundleId"
:
"io.dcloud.game.cat"
}
}
},
"mp-weixin"
:
{
"oauth"
:
{
"weixin"
:
{
"appid"
:
"wx999bf02c8e05dfc9"
,
"appsecret"
:
"b5f608afd332b2c0ded7e6b98ca4ccd3"
}
}
},
"mp-alipay"
:
{
"oauth"
:
{
"alipay"
:
{
"appid"
:
"alipay appid"
,
"privateKey"
:
"alipay privateKey"
}
}
},
"service"
:
{
"sms"
:
{
"name"
:
"DCloud"
,
"codeExpiresIn"
:
300
,
"smsKey"
:
"71a19f38c954f7d768d68a050486bf15"
,
"smsSecret"
:
"d6c424b702d73baa3b6e1a1452469213"
},
"univerify"
:
{
"appid"
:
"__UNI__BC54A00"
,
"apiKey"
:
"d1e36bcd497b3795434d900dcfdd44dc"
,
"apiSecret"
:
"2feb378ff1114362b20ac179b572293e"
}
}
}
uni_modules/uni-quick-login/components/uni-quick-login/uni-quick-login.vue
浏览文件 @
a921045c
...
...
@@ -98,12 +98,15 @@
let
oauthService
=
this
.
oauthServices
.
find
((
service
)
=>
service
.
id
==
type
)
// #ifdef APP-PLUS
//uni.showLoading({mask: true});
console
.
log
(
type
,
231
);
//请勿直接使用前端获取的unionid或openid直接用于登陆,前端的数据都是不可靠的
if
(
type
==
'
weixin
'
){
oauthService
.
authorize
(({
code
})
=>
{
console
.
log
(
code
);
this
.
quickLogin
({
code
},
type
)
},
err
=>
{
console
.
log
(
err
);
})
}
...
...
uni_modules/uni-upgrade-center-app/changelog.md
浏览文件 @
a921045c
## 0.1.2(2021-04-07)
-
更新版本对比函数 compare
## 0.1.1(2021-04-07)
-
修复 腾讯云空间下载链接不能下载问题
## 0.1.0(2021-04-07)
-
新增使用uni.showModal提示升级示例
-
修改iOS升级提示方式
## 0.0.7(2021-04-02)
-
修复在iOS上打开弹框报错
## 0.0.6(2021-04-01)
-
兼容旧版本安卓
## 0.0.5(2021-04-01)
...
...
uni_modules/uni-upgrade-center-app/package.json
浏览文件 @
a921045c
{
"id"
:
"uni-upgrade-center-app"
,
"displayName"
:
"升级中心 uni-upgrade-center - App"
,
"version"
:
"0.
0.6"
,
"description"
:
"升级中心前台检查更新"
,
"keywords"
:
[
"uniCloud"
,
"admin"
,
"update"
,
"升级"
,
"wgt"
],
"repository"
:
"https://gitee.com/dcloud/uni-upgrade-center/tree/master/uni_modules/uni-upgrade-center-app"
,
"engines"
:
{
"HBuilderX"
:
"^3.1.0"
},
"dcloudext"
:
{
"category"
:
[
"uniCloud"
,
"云端一体页面模板"
],
"sale"
:
{
"regular"
:
{
"price"
:
"0.00"
},
"sourcecode"
:
{
"price"
:
"0.00"
}
},
"contact"
:
{
"qq"
:
""
},
"declaration"
:
{
"ads"
:
"无"
,
"data"
:
"插件不采集任何数据"
,
"permissions"
:
"无"
},
"npmurl"
:
""
},
"uni_modules"
:
{
"dependencies"
:
[],
"encrypt"
:
[],
"platforms"
:
{
"cloud"
:
{
"tcb"
:
"y"
,
"aliyun"
:
"y"
},
"client"
:
{
"App"
:
{
"app-vue"
:
"u"
,
"app-nvue"
:
"u"
},
"H5-mobile"
:
{
"Safari"
:
"u"
,
"Android Browser"
:
"u"
,
"微信浏览器(Android)"
:
"u"
,
"QQ浏览器(Android)"
:
"u"
},
"H5-pc"
:
{
"Chrome"
:
"u"
,
"IE"
:
"u"
,
"Edge"
:
"u"
,
"Firefox"
:
"u"
,
"Safari"
:
"u"
},
"小程序"
:
{
"微信"
:
"u"
,
"阿里"
:
"u"
,
"百度"
:
"u"
,
"字节跳动"
:
"u"
,
"QQ"
:
"u"
},
"快应用"
:
{
"华为"
:
"u"
,
"联盟"
:
"u"
}
}
}
}
{
"id"
:
"uni-upgrade-center-app"
,
"displayName"
:
"升级中心 uni-upgrade-center - App"
,
"version"
:
"0.
1.2"
,
"description"
:
"升级中心前台检查更新"
,
"keywords"
:
[
"uniCloud"
,
"admin"
,
"update"
,
"升级"
,
"wgt"
],
"repository"
:
"https://gitee.com/dcloud/uni-upgrade-center/tree/master/uni_modules/uni-upgrade-center-app"
,
"engines"
:
{
"HBuilderX"
:
"^3.1.0"
},
"dcloudext"
:
{
"category"
:
[
"uniCloud"
,
"云端一体页面模板"
],
"sale"
:
{
"regular"
:
{
"price"
:
"0.00"
},
"sourcecode"
:
{
"price"
:
"0.00"
}
},
"contact"
:
{
"qq"
:
""
},
"declaration"
:
{
"ads"
:
"无"
,
"data"
:
"插件不采集任何数据"
,
"permissions"
:
"无"
},
"npmurl"
:
""
},
"uni_modules"
:
{
"dependencies"
:
[],
"encrypt"
:
[],
"platforms"
:
{
"cloud"
:
{
"tcb"
:
"y"
,
"aliyun"
:
"y"
},
"client"
:
{
"App"
:
{
"app-vue"
:
"u"
,
"app-nvue"
:
"u"
},
"H5-mobile"
:
{
"Safari"
:
"u"
,
"Android Browser"
:
"u"
,
"微信浏览器(Android)"
:
"u"
,
"QQ浏览器(Android)"
:
"u"
},
"H5-pc"
:
{
"Chrome"
:
"u"
,
"IE"
:
"u"
,
"Edge"
:
"u"
,
"Firefox"
:
"u"
,
"Safari"
:
"u"
},
"小程序"
:
{
"微信"
:
"u"
,
"阿里"
:
"u"
,
"百度"
:
"u"
,
"字节跳动"
:
"u"
,
"QQ"
:
"u"
},
"快应用"
:
{
"华为"
:
"u"
,
"联盟"
:
"u"
}
}
}
}
}
uni_modules/uni-upgrade-center-app/pages/upgrade-popup.vue
浏览文件 @
a921045c
<
template
>
<view
class=
"mask flex-center"
>
<view
class=
"content botton-radius"
>
<view
class=
"content-top"
>
<text
class=
"content-top-text"
>
{{
title
}}
</text>
<image
class=
"content-top"
style=
"top: 0;"
width=
"100%"
height=
"100%"
src=
"../static/bg_top.png"
>
</image>
</view>
<view
class=
"content-header"
></view>
<view
class=
"content-body"
>
<view
class=
"title"
>
<text>
{{
subTitle
}}
</text>
<!--
<text
style=
"padding-left:20rpx;font-size: 0.5em;color: #666;"
>
v.
{{
version
}}
</text>
-->
</view>
<view
class=
"body"
>
<scroll-view
class=
"box-des-scroll"
scroll-y=
"true"
>
<text
class=
"box-des"
>
{{
contents
}}
</text>
</scroll-view>
</view>
<view
class=
"footer flex-center"
>
<template
v-if=
"!downloadSuccess"
>
<view
class=
"progress-box flex-column"
v-if=
"downloading"
>
<progress
class=
"progress"
border-radius=
"35"
:percent=
"downLoadPercent"
activeColor=
"#3DA7FF"
show-info
stroke-width=
"10"
/>
<view
style=
"width:100%;font-size: 28rpx;display: flex;justify-content: space-around;"
>
<text>
{{
downLoadingText
}}
</text>
<text>
(
{{
downloadedSize
}}
/
{{
packageFileSize
}}
M)
</text>
</view>
</view>
<button
v-else
class=
"content-button"
style=
"border: none;color: #fff;"
plain
@
click=
"downloadPackage"
>
{{
downLoadBtnText
}}
</button>
</
template
>
<button
v-else-if=
"downloadSuccess && !installed"
class=
"content-button"
style=
"border: none;color: #fff;"
plain
:loading=
"installing"
:disabled=
"installing"
@
click=
"installPackage"
>
{{installing ? '正在安装……' : '下载完成,立即安装'}}
</button>
<button
v-if=
"installed && isWGT"
class=
"content-button"
style=
"border: none;color: #fff;"
plain
@
click=
"restart"
>
安装完毕,点击重启
</button>
</view>
</view>
<image
v-if=
"!is_mandatory"
class=
"close-img"
src=
"../static/app_update_close.png"
@
click.stop=
"closeUpdate"
></image>
</view>
</view>
</template>
<
script
>
const
localFilePathKey
=
'
__localFilePath__
'
let
downloadTask
=
null
;
<
template
>
<view
class=
"mask flex-center"
>
<view
class=
"content botton-radius"
>
<view
class=
"content-top"
>
<text
class=
"content-top-text"
>
{{
title
}}
</text>
<image
class=
"content-top"
style=
"top: 0;"
width=
"100%"
height=
"100%"
src=
"../static/bg_top.png"
>
</image>
</view>
<view
class=
"content-header"
></view>
<view
class=
"content-body"
>
<view
class=
"title"
>
<text>
{{
subTitle
}}
</text>
<!--
<text
style=
"padding-left:20rpx;font-size: 0.5em;color: #666;"
>
v.
{{
version
}}
</text>
-->
</view>
<view
class=
"body"
>
<scroll-view
class=
"box-des-scroll"
scroll-y=
"true"
>
<text
class=
"box-des"
>
{{
contents
}}
</text>
</scroll-view>
</view>
<view
class=
"footer flex-center"
>
<template
v-if=
"isiOS"
>
<button
class=
"content-button"
style=
"border: none;color: #fff;"
plain
@
click=
"jumpToAppStore"
>
{{
downLoadBtnTextiOS
}}
</button>
</
template
>
<
template
v-else
>
<template
v-if=
"!downloadSuccess"
>
<view
class=
"progress-box flex-column"
v-if=
"downloading"
>
<progress
class=
"progress"
border-radius=
"35"
:percent=
"downLoadPercent"
activeColor=
"#3DA7FF"
show-info
stroke-width=
"10"
/>
<view
style=
"width:100%;font-size: 28rpx;display: flex;justify-content: space-around;"
>
<text>
{{
downLoadingText
}}
</text>
<text>
(
{{
downloadedSize
}}
/
{{
packageFileSize
}}
M)
</text>
</view>
</view>
<button
v-else
class=
"content-button"
style=
"border: none;color: #fff;"
plain
@
click=
"downloadPackage"
>
{{
downLoadBtnText
}}
</button>
</
template
>
<button
v-else-if=
"downloadSuccess && !installed"
class=
"content-button"
style=
"border: none;color: #fff;"
plain
:loading=
"installing"
:disabled=
"installing"
@
click=
"installPackage"
>
{{installing ? '正在安装……' : '下载完成,立即安装'}}
</button>
<button
v-if=
"installed && isWGT"
class=
"content-button"
style=
"border: none;color: #fff;"
plain
@
click=
"restart"
>
安装完毕,点击重启
</button>
</template>
</view>
</view>
<image
v-if=
"!is_mandatory"
class=
"close-img"
src=
"../static/app_update_close.png"
@
click.stop=
"closeUpdate"
></image>
</view>
</view>
</template>
<
script
>
const
localFilePathKey
=
'
__localFilePath__
'
const
platform_iOS
=
'
iOS
'
;
let
downloadTask
=
null
;
/**
* 对比版本号,如需要,请自行修改判断规则
* 支持比对 ("3.0.0.0.0.1.0.1", "3.0.0.0.0.1") ("3.0.0.1", "3.0") ("3.1.1", "3.1.1.1") 之类的
* @param {Object} v1
* @param {Object} v2
* v1 > v2 return 1
* v1 < v2 return -1
* v1 == v2 return 0
*/
function
compare
(
v1
=
0
,
v2
=
0
)
{
// '1.2.5' > '1.2.4' 类似的版本号可以直接对比
return
v1
>
v2
?
1
:
v1
<
v2
?
-
1
:
0
;
}
export
default
{
data
()
{
return
{
// 从之前下载安装
installForBeforeFilePath
:
''
,
// 安装
installed
:
false
,
installing
:
false
,
// 下载
downloadSuccess
:
false
,
downloading
:
false
,
downLoadPercent
:
0
,
downloadedSize
:
0
,
packageFileSize
:
0
,
tempFilePath
:
''
,
// 要安装的本地包地址
// 默认安装包信息
title
:
'
更新日志
'
,
contents
:
''
,
is_mandatory
:
false
,
// 可自定义属性
subTitle
:
'
发现新版本
'
,
downLoadBtnText
:
'
立即下载更新
'
,
downLoadingText
:
'
安装包下载中,请稍后
'
}
},
onLoad
({
local_storage_key
})
{
if
(
!
local_storage_key
)
{
console
.
error
(
'
local_storage_key为空,请检查后重试
'
)
uni
.
navigateBack
()
return
;
};
const
localPackageInfo
=
uni
.
getStorageSync
(
local_storage_key
);
if
(
!
localPackageInfo
)
{
console
.
error
(
'
安装包信息为空,请检查后重试
'
)
uni
.
navigateBack
()
return
;
};
const
requiredKey
=
[
'
version
'
,
'
url
'
,
'
type
'
]
for
(
let
key
in
localPackageInfo
)
{
if
(
requiredKey
.
indexOf
(
key
)
!==
-
1
&&
!
localPackageInfo
[
key
])
{
console
.
error
(
`参数
${
key
}
必填,请检查后重试`
)
uni
.
navigateBack
()
return
;
}
}
Object
.
assign
(
this
,
localPackageInfo
)
this
.
checkLocalStoragePackage
()
},
onBackPress
()
{
// 强制更新不允许返回
if
(
this
.
is_mandatory
)
{
return
true
function
compare
(
v1
=
'
0
'
,
v2
=
'
0
'
)
{
v1
=
String
(
v1
).
split
(
'
.
'
)
v2
=
String
(
v2
).
split
(
'
.
'
)
const
minVersionLens
=
Math
.
min
(
v1
.
length
,
v2
.
length
);
let
result
=
0
;
for
(
let
i
=
0
;
i
<
minVersionLens
;
i
++
)
{
const
curV1
=
Number
(
v1
[
i
])
const
curV2
=
Number
(
v2
[
i
])
if
(
curV1
>
curV2
)
{
result
=
1
break
;
}
else
if
(
curV1
<
curV2
)
{
result
=
-
1
break
;
}
}
downloadTask
&&
downloadTask
.
abort
()
},
computed
:
{
isWGT
()
{
return
this
.
type
===
'
wgt
'
}
},
methods
:
{
checkLocalStoragePackage
()
{
// 如果已经有下载好的包,则直接提示安装
const
localFilePathRecord
=
uni
.
getStorageSync
(
localFilePathKey
)
if
(
localFilePathRecord
)
{
const
{
version
,
savedFilePath
}
=
localFilePathRecord
// 比对版本
if
(
compare
(
version
,
this
.
version
)
===
0
)
{
this
.
downloadSuccess
=
true
;
this
.
installForBeforeFilePath
=
savedFilePath
;
this
.
tempFilePath
=
savedFilePath
}
else
{
// 如果保存的包版本小,则直接删除
this
.
deleteSavedFile
(
savedFilePath
)
}
}
},
async
closeUpdate
()
{
if
(
this
.
downloading
)
{
if
(
this
.
is_mandatory
)
{
return
uni
.
showToast
({
title
:
'
下载中,请稍后……
'
,
icon
:
'
none
'
,
duration
:
500
})
}
uni
.
showModal
({
title
:
'
是否取消下载?
'
,
cancelText
:
'
否
'
,
confirmText
:
'
是
'
,
success
:
res
=>
{
if
(
res
.
confirm
)
{
downloadTask
&&
downloadTask
.
abort
()
uni
.
navigateBack
()
}
}
});
return
;
}
if
(
this
.
downloadSuccess
&&
this
.
tempFilePath
)
{
// 包已经下载完毕,稍后安装,将包保存在本地
await
this
.
saveFile
(
this
.
tempFilePath
,
this
.
version
)
uni
.
navigateBack
()
return
;
}
uni
.
navigateBack
()
},
downloadPackage
()
{
this
.
downloading
=
true
;
//下载包
downloadTask
=
uni
.
downloadFile
({
url
:
this
.
url
,
success
:
res
=>
{
if
(
res
.
statusCode
==
200
)
{
this
.
downloadSuccess
=
true
;
this
.
tempFilePath
=
res
.
tempFilePath
console
.
log
(
"
res.tempFilePath:
"
,
res
.
tempFilePath
);
// 强制更新,直接安装
if
(
this
.
is_mandatory
)
{
this
.
installPackage
();
}
}
},
complete
:
()
=>
{
this
.
downloading
=
false
;
this
.
downLoadPercent
=
0
this
.
downloadedSize
=
0
this
.
packageFileSize
=
0
downloadTask
=
null
;
}
});
downloadTask
.
onProgressUpdate
(
res
=>
{
this
.
downLoadPercent
=
res
.
progress
;
this
.
downloadedSize
=
(
res
.
totalBytesWritten
/
Math
.
pow
(
1024
,
2
)).
toFixed
(
2
);
this
.
packageFileSize
=
(
res
.
totalBytesExpectedToWrite
/
Math
.
pow
(
1024
,
2
)).
toFixed
(
2
);
});
},
installPackage
()
{
// #ifdef APP-PLUS
// wgt资源包安装
if
(
this
.
isWGT
)
{
this
.
installing
=
true
;
}
plus
.
runtime
.
install
(
this
.
tempFilePath
,
{
force
:
false
},
async
res
=>
{
this
.
installing
=
false
;
this
.
installed
=
true
;
// 如果是安装之前的包,安装成功后删除之前的包
if
(
this
.
installForBeforeFilePath
)
{
await
this
.
deleteSavedFile
(
this
.
installForBeforeFilePath
)
this
.
installForBeforeFilePath
=
''
;
}
// wgt包,安装后会提示 安装成功,是否重启
if
(
this
.
isWGT
)
{
// 强制更新安装完成重启
if
(
this
.
is_mandatory
)
{
uni
.
showLoading
({
icon
:
'
none
'
,
title
:
'
安装成功,正在重启……
'
})
setTimeout
(()
=>
{
uni
.
hideLoading
()
this
.
restart
();
},
1000
)
}
else
{
uni
.
showLoading
({
icon
:
'
none
'
,
title
:
'
安装成功,重启应用体验新版
'
,
duration
:
1000
})
}
}
},
async
err
=>
{
// 如果是安装之前的包,安装失败后删除之前的包
if
(
this
.
installForBeforeFilePath
)
{
await
this
.
deleteSavedFile
(
this
.
installForBeforeFilePath
)
this
.
installForBeforeFilePath
=
''
;
}
// 安装失败需要重新下载安装包
this
.
installed
=
false
;
uni
.
showModal
({
title
:
'
更新失败
'
,
content
:
err
.
message
,
showCancel
:
false
});
});
// 非wgt包,安装跳出覆盖安装,此处直接返回上一页
if
(
!
this
.
isWGT
)
{
uni
.
navigateBack
()
}
// #endif
},
restart
()
{
this
.
installed
=
false
;
// #ifdef APP-PLUS
//更新完重启app
plus
.
runtime
.
restart
();
// #endif
},
async
saveFile
(
tempFilePath
,
version
)
{
const
[
err
,
res
]
=
await
uni
.
saveFile
({
tempFilePath
})
if
(
err
)
{
return
;
if
(
result
===
0
&&
(
v1
.
length
!==
v2
.
length
))
{
const
v1BiggerThenv2
=
v1
.
length
>
v2
.
length
;
const
maxLensVersion
=
v1BiggerThenv2
?
v1
:
v2
;
for
(
let
i
=
minVersionLens
;
i
<
maxLensVersion
.
length
;
i
++
)
{
const
curVersion
=
Number
(
maxLensVersion
[
i
])
if
(
curVersion
>
0
)
{
v1BiggerThenv2
?
result
=
1
:
result
=
-
1
break
;
}
uni
.
setStorageSync
(
localFilePathKey
,
{
version
,
savedFilePath
:
res
.
savedFilePath
})
},
deleteSavedFile
(
filePath
)
{
uni
.
removeStorageSync
(
localFilePathKey
)
return
uni
.
removeSavedFile
({
filePath
})
}
}
}
</
script
>
<
style
>
page
{
background
:
transparent
;
}
.flex-center
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
justify-content
:
center
;
align-items
:
center
;
}
.mask
{
position
:
fixed
;
left
:
0
;
top
:
0
;
right
:
0
;
bottom
:
0
;
background-color
:
rgba
(
0
,
0
,
0
,
.65
);
}
.botton-radius
{
border-bottom-left-radius
:
30
rpx
;
border-bottom-right-radius
:
30
rpx
;
}
.content
{
position
:
relative
;
top
:
0
;
width
:
600
rpx
;
background-color
:
#fff
;
box-sizing
:
border-box
;
padding
:
0
50
rpx
;
font-family
:
Source
Han
Sans
CN
;
}
.text
{
/* #ifndef APP-NVUE */
display
:
block
;
/* #endif */
line-height
:
200px
;
text-align
:
center
;
color
:
#FFFFFF
;
}
.content-top
{
position
:
absolute
;
top
:
-195
rpx
;
left
:
0
;
width
:
600
rpx
;
height
:
270
rpx
;
}
.content-top-text
{
font-size
:
45
rpx
;
font-weight
:
bold
;
color
:
#F8F8FA
;
position
:
absolute
;
top
:
120
rpx
;
left
:
50
rpx
;
z-index
:
1
;
}
.content-header
{
height
:
70
rpx
;
}
.title
{
font-size
:
33
rpx
;
font-weight
:
bold
;
color
:
#3DA7FF
;
line-height
:
38px
;
}
.footer
{
height
:
150
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
space-around
;
}
.box-des-scroll
{
box-sizing
:
border-box
;
padding
:
0
40
rpx
;
height
:
200
rpx
;
text-align
:
left
;
}
.box-des
{
font-size
:
26
rpx
;
color
:
#000000
;
line-height
:
50
rpx
;
}
.progress-box
{
width
:
100%
;
}
.progress
{
width
:
90%
;
height
:
40
rpx
;
border-radius
:
35px
;
}
.close-img
{
width
:
70
rpx
;
height
:
70
rpx
;
z-index
:
1000
;
position
:
absolute
;
bottom
:
-120
rpx
;
left
:
calc
(
50%
-
70
rpx
/
2
);
}
.content-button
{
text-align
:
center
;
flex
:
1
;
font-size
:
30
rpx
;
font-weight
:
400
;
color
:
#FFFFFF
;
height
:
80
rpx
;
line-height
:
80
rpx
;
background
:
url(../static/button_bg.png)
no-repeat
center
/
contain
;
}
.flex-column
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
}
return
result
;
}
export
default
{
data
()
{
return
{
// 从之前下载安装
installForBeforeFilePath
:
''
,
// 安装
installed
:
false
,
installing
:
false
,
// 下载
downloadSuccess
:
false
,
downloading
:
false
,
downLoadPercent
:
0
,
downloadedSize
:
0
,
packageFileSize
:
0
,
tempFilePath
:
''
,
// 要安装的本地包地址
// 默认安装包信息
title
:
'
更新日志
'
,
contents
:
''
,
is_mandatory
:
false
,
// 可自定义属性
subTitle
:
'
发现新版本
'
,
downLoadBtnTextiOS
:
'
立即跳转更新
'
,
downLoadBtnText
:
'
立即下载更新
'
,
downLoadingText
:
'
安装包下载中,请稍后…
'
}
},
onLoad
({
local_storage_key
})
{
if
(
!
local_storage_key
)
{
console
.
error
(
'
local_storage_key为空,请检查后重试
'
)
uni
.
navigateBack
()
return
;
};
const
localPackageInfo
=
uni
.
getStorageSync
(
local_storage_key
);
if
(
!
localPackageInfo
)
{
console
.
error
(
'
安装包信息为空,请检查后重试
'
)
uni
.
navigateBack
()
return
;
};
const
requiredKey
=
[
'
version
'
,
'
url
'
,
'
type
'
]
for
(
let
key
in
localPackageInfo
)
{
if
(
requiredKey
.
indexOf
(
key
)
!==
-
1
&&
!
localPackageInfo
[
key
])
{
console
.
error
(
`参数
${
key
}
必填,请检查后重试`
)
uni
.
navigateBack
()
return
;
}
}
Object
.
assign
(
this
,
localPackageInfo
)
this
.
checkLocalStoragePackage
()
},
onBackPress
()
{
// 强制更新不允许返回
if
(
this
.
is_mandatory
)
{
return
true
}
downloadTask
&&
downloadTask
.
abort
()
},
computed
:
{
isWGT
()
{
return
this
.
type
===
'
wgt
'
},
isiOS
()
{
return
!
this
.
isWGT
?
this
.
platform
.
includes
(
platform_iOS
)
:
false
;
}
},
methods
:
{
checkLocalStoragePackage
()
{
// 如果已经有下载好的包,则直接提示安装
const
localFilePathRecord
=
uni
.
getStorageSync
(
localFilePathKey
)
if
(
localFilePathRecord
)
{
const
{
version
,
savedFilePath
}
=
localFilePathRecord
// 比对版本
if
(
compare
(
version
,
this
.
version
)
===
0
)
{
this
.
downloadSuccess
=
true
;
this
.
installForBeforeFilePath
=
savedFilePath
;
this
.
tempFilePath
=
savedFilePath
}
else
{
// 如果保存的包版本小,则直接删除
this
.
deleteSavedFile
(
savedFilePath
)
}
}
},
async
closeUpdate
()
{
if
(
this
.
downloading
)
{
if
(
this
.
is_mandatory
)
{
return
uni
.
showToast
({
title
:
'
下载中,请稍后……
'
,
icon
:
'
none
'
,
duration
:
500
})
}
uni
.
showModal
({
title
:
'
是否取消下载?
'
,
cancelText
:
'
否
'
,
confirmText
:
'
是
'
,
success
:
res
=>
{
if
(
res
.
confirm
)
{
downloadTask
&&
downloadTask
.
abort
()
uni
.
navigateBack
()
}
}
});
return
;
}
if
(
this
.
downloadSuccess
&&
this
.
tempFilePath
)
{
// 包已经下载完毕,稍后安装,将包保存在本地
await
this
.
saveFile
(
this
.
tempFilePath
,
this
.
version
)
uni
.
navigateBack
()
return
;
}
uni
.
navigateBack
()
},
downloadPackage
()
{
this
.
downloading
=
true
;
//下载包
downloadTask
=
uni
.
downloadFile
({
url
:
this
.
url
,
success
:
res
=>
{
if
(
res
.
statusCode
==
200
)
{
this
.
downloadSuccess
=
true
;
this
.
tempFilePath
=
res
.
tempFilePath
// 强制更新,直接安装
if
(
this
.
is_mandatory
)
{
this
.
installPackage
();
}
}
},
complete
:
()
=>
{
this
.
downloading
=
false
;
this
.
downLoadPercent
=
0
this
.
downloadedSize
=
0
this
.
packageFileSize
=
0
downloadTask
=
null
;
}
});
downloadTask
.
onProgressUpdate
(
res
=>
{
this
.
downLoadPercent
=
res
.
progress
;
this
.
downloadedSize
=
(
res
.
totalBytesWritten
/
Math
.
pow
(
1024
,
2
)).
toFixed
(
2
);
this
.
packageFileSize
=
(
res
.
totalBytesExpectedToWrite
/
Math
.
pow
(
1024
,
2
)).
toFixed
(
2
);
});
},
installPackage
()
{
// #ifdef APP-PLUS
// wgt资源包安装
if
(
this
.
isWGT
)
{
this
.
installing
=
true
;
}
plus
.
runtime
.
install
(
this
.
tempFilePath
,
{
force
:
false
},
async
res
=>
{
this
.
installing
=
false
;
this
.
installed
=
true
;
// 如果是安装之前的包,安装成功后删除之前的包
if
(
this
.
installForBeforeFilePath
)
{
await
this
.
deleteSavedFile
(
this
.
installForBeforeFilePath
)
this
.
installForBeforeFilePath
=
''
;
}
// wgt包,安装后会提示 安装成功,是否重启
if
(
this
.
isWGT
)
{
// 强制更新安装完成重启
if
(
this
.
is_mandatory
)
{
uni
.
showLoading
({
icon
:
'
none
'
,
title
:
'
安装成功,正在重启……
'
})
setTimeout
(()
=>
{
uni
.
hideLoading
()
this
.
restart
();
},
1000
)
}
else
{
uni
.
showLoading
({
icon
:
'
none
'
,
title
:
'
安装成功,重启应用体验新版
'
,
duration
:
1000
})
}
}
},
async
err
=>
{
// 如果是安装之前的包,安装失败后删除之前的包
if
(
this
.
installForBeforeFilePath
)
{
await
this
.
deleteSavedFile
(
this
.
installForBeforeFilePath
)
this
.
installForBeforeFilePath
=
''
;
}
// 安装失败需要重新下载安装包
this
.
installed
=
false
;
uni
.
showModal
({
title
:
'
更新失败
'
,
content
:
err
.
message
,
showCancel
:
false
});
});
// 非wgt包,安装跳出覆盖安装,此处直接返回上一页
if
(
!
this
.
isWGT
)
{
uni
.
navigateBack
()
}
// #endif
},
restart
()
{
this
.
installed
=
false
;
// #ifdef APP-PLUS
//更新完重启app
plus
.
runtime
.
restart
();
// #endif
},
async
saveFile
(
tempFilePath
,
version
)
{
const
[
err
,
res
]
=
await
uni
.
saveFile
({
tempFilePath
})
if
(
err
)
{
return
;
}
uni
.
setStorageSync
(
localFilePathKey
,
{
version
,
savedFilePath
:
res
.
savedFilePath
})
},
deleteSavedFile
(
filePath
)
{
uni
.
removeStorageSync
(
localFilePathKey
)
return
uni
.
removeSavedFile
({
filePath
})
},
jumpToAppStore
()
{
plus
.
runtime
.
openURL
(
this
.
url
);
}
}
}
</
script
>
<
style
>
page
{
background
:
transparent
;
}
.flex-center
{
/* #ifndef APP-NVUE */
display
:
flex
;
/* #endif */
justify-content
:
center
;
align-items
:
center
;
}
.mask
{
position
:
fixed
;
left
:
0
;
top
:
0
;
right
:
0
;
bottom
:
0
;
background-color
:
rgba
(
0
,
0
,
0
,
.65
);
}
.botton-radius
{
border-bottom-left-radius
:
30
rpx
;
border-bottom-right-radius
:
30
rpx
;
}
.content
{
position
:
relative
;
top
:
0
;
width
:
600
rpx
;
background-color
:
#fff
;
box-sizing
:
border-box
;
padding
:
0
50
rpx
;
font-family
:
Source
Han
Sans
CN
;
}
.text
{
/* #ifndef APP-NVUE */
display
:
block
;
/* #endif */
line-height
:
200px
;
text-align
:
center
;
color
:
#FFFFFF
;
}
.content-top
{
position
:
absolute
;
top
:
-195
rpx
;
left
:
0
;
width
:
600
rpx
;
height
:
270
rpx
;
}
.content-top-text
{
font-size
:
45
rpx
;
font-weight
:
bold
;
color
:
#F8F8FA
;
position
:
absolute
;
top
:
120
rpx
;
left
:
50
rpx
;
z-index
:
1
;
}
.content-header
{
height
:
70
rpx
;
}
.title
{
font-size
:
33
rpx
;
font-weight
:
bold
;
color
:
#3DA7FF
;
line-height
:
38px
;
}
.footer
{
height
:
150
rpx
;
display
:
flex
;
align-items
:
center
;
justify-content
:
space-around
;
}
.box-des-scroll
{
box-sizing
:
border-box
;
padding
:
0
40
rpx
;
height
:
200
rpx
;
text-align
:
left
;
}
.box-des
{
font-size
:
26
rpx
;
color
:
#000000
;
line-height
:
50
rpx
;
}
.progress-box
{
width
:
100%
;
}
.progress
{
width
:
90%
;
height
:
40
rpx
;
border-radius
:
35px
;
}
.close-img
{
width
:
70
rpx
;
height
:
70
rpx
;
z-index
:
1000
;
position
:
absolute
;
bottom
:
-120
rpx
;
left
:
calc
(
50%
-
70
rpx
/
2
);
}
.content-button
{
text-align
:
center
;
flex
:
1
;
font-size
:
30
rpx
;
font-weight
:
400
;
color
:
#FFFFFF
;
height
:
80
rpx
;
line-height
:
80
rpx
;
background
:
url(../static/button_bg.png)
no-repeat
center
/
contain
;
}
.flex-column
{
display
:
flex
;
flex-direction
:
column
;
align-items
:
center
;
}
</
style
>
uni_modules/uni-upgrade-center-app/readme.md
浏览文件 @
a921045c
# uni-upgrade-center - App
### 概述
# uni-upgrade-center - App
### 概述
> 统一管理App及App在`Android`、`iOS`平台上`App安装包`和`wgt资源包`的发布升级
> 本插件为升级中心前台检查更新,后台Admin管理系统请点击查看 [uni-upgrade-center](https://ext.dcloud.net.cn/plugin?id=4470)
### 基于uni-upgrade-center的App前台检查升级插件
-
一键式检查更新,统一整包与wgt资源包更新
-
好看、实用、可自定义、可拓展的前台更新弹框
## 安装指引
1.
使用
`HBuilderX 3.1.0+`
,因为要使用到
`uni_modules`
3.
在插件市场打开本插件页面,在右侧点击
`使用 HBuilderX 导入插件`
,选择要导入的项目点击确定
### 基于uni-upgrade-center的App前台检查升级插件
-
一键式检查更新,统一整包与wgt资源包更新
-
好看、实用、可自定义、可拓展的前台更新弹框
## 安装指引
1.
使用
`HBuilderX 3.1.0+`
,因为要使用到
`uni_modules`
3.
在插件市场打开本插件页面,在右侧点击
`使用 HBuilderX 导入插件`
,选择要导入的项目点击确定
5.
找到
`/uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version`
,右键上传部署
6.
在
`pages.json`
中添加页面路径
```
json
"pages"
:
[
//
……其他页面配置
{
"path"
:
"uni_modules/uni-upgrade-center-app/pages/upgrade-popup"
,
"style"
:
{
"disableScroll"
:
true
,
"app-plus"
:
{
"backgroundColorTop"
:
"transparent"
,
"background"
:
"transparent"
,
"titleNView"
:
false
,
"scrollIndicator"
:
false
,
"popGesture"
:
"none"
,
"animationType"
:
"fade-in"
,
"animationDuration"
:
200
}
}
}
]
6.
在
`pages.json`
中添加页面路径
```
json
"pages"
:
[
//
……其他页面配置
{
"path"
:
"uni_modules/uni-upgrade-center-app/pages/upgrade-popup"
,
"style"
:
{
"disableScroll"
:
true
,
"app-plus"
:
{
"backgroundColorTop"
:
"transparent"
,
"background"
:
"transparent"
,
"titleNView"
:
false
,
"scrollIndicator"
:
false
,
"popGesture"
:
"none"
,
"animationType"
:
"fade-in"
,
"animationDuration"
:
200
}
}
}
]
```
7.
将
`/uni_modules/uni-upgrade-center-app/utils/check-update`
import到需要用到的地方,调用一下即可
7.
将
`/uni_modules/uni-upgrade-center-app/utils/check-update`
import到需要用到的地方,调用一下即可
8.
升级弹框可自行编写,也可以使用
`uni.showModal`
,或使用现有的升级弹框样式,如果不满足UI需求请自行替换资源文件。在
`utils/check-update.js`
中都有实例。
### 更新下载安装`check-update.js`
*该函数在utils目录下*
1.
如果是静默更新,则不会打开更新弹框,会在后台下载后安装,下次启动应用生效
1.
如果是静默更新,则不会打开更新弹框,会在后台下载后安装,下次启动应用生效
2.
如果是 iOS,则会直接打开AppStore的链接
3.
其他情况,会将
`check-version`
返回的结果保存在localStorage中,并跳转进入
`upgrade-popup.vue`
打开更新弹框
3.
其他情况,会将
`check-version`
返回的结果保存在localStorage中,并跳转进入
`upgrade-popup.vue`
打开更新弹框
### 检查更新函数`check-version`
### 检查更新函数`check-version`
*该函数在uniCloud/cloudfunctions目录下*
1.
使用检查更新需要传递三个参数
`appid`
、
`appVersion`
、
`wgtVersion`
2.
`appid`
使用 plus.runtime.appid 获取,
*注:真机运行时为固定值HBuilder,在调试的时候请使用本地调试云函数*
3.
`appVersion`
使用 plus.runtime.version 获取
4.
`wgtVersion`
使用 plus.runtime.getProperty(plus.runtime.appid,(wgtInfo) => { wgtInfo.version }) 获取
5.
`check-version`
云函数内部会自动获取 App 平台
6.
检查更新前端使用示例:
`uni_modules/uni-upgrade-center-app/utils/check-update.js`
,在要用的地方导入调用即可
1.
使用检查更新需要传递三个参数
`appid`
、
`appVersion`
、
`wgtVersion`
2.
`appid`
使用 plus.runtime.appid 获取,
*注:真机运行时为固定值HBuilder,在调试的时候请使用本地调试云函数*
3.
`appVersion`
使用 plus.runtime.version 获取
4.
`wgtVersion`
使用 plus.runtime.getProperty(plus.runtime.appid,(wgtInfo) => { wgtInfo.version }) 获取
5.
`check-version`
云函数内部会自动获取 App 平台
6.
检查更新前端使用示例:
`uni_modules/uni-upgrade-center-app/utils/check-update.js`
,在要检查更新的地方导入调用即可
## 项目代码说明
### 更新弹框
-
`upgrade-popup.vue`
- 更新应用:
-
如果
`check-version`
返回的参数表明需要更新,则将参数保存在localStorage中,带着键值跳转该页面
-
进入时会先从localStorage中尝试取出之前存的安装包路径(此包不会是强制安装类型的包)
-
如果有已经保存的包,则和传进来的
`version`
进行比较,如果相等则安装。大于和小于都不进行安装,因为admin端可能会调整包的版本。不符合更新会将此包删除
-
如果本地没有包或者包不符合安装条件,则进行下载安装包
-
点击下载会有进度条、已下载大小和下载包的大小
### 更新弹框
-
`upgrade-popup.vue`
- 更新应用:
-
如果
`check-version`
返回的参数表明需要更新,则将参数保存在localStorage中,带着键值跳转该页面
-
进入时会先从localStorage中尝试取出之前存的安装包路径(此包不会是强制安装类型的包)
-
如果有已经保存的包,则和传进来的
`version`
进行比较,如果相等则安装。大于和小于都不进行安装,因为admin端可能会调整包的版本。不符合更新会将此包删除
-
如果本地没有包或者包不符合安装条件,则进行下载安装包
-
点击下载会有进度条、已下载大小和下载包的大小
-
下载完成会提示安装:
-
如果是 wgt 包,安装时则会提示 正在安装…… 和 安装完成。安装完成会提示是否重启
-
如果是 原生安装包,则直接跳出去覆盖安装
-
下载过程中,如果退出会提示是否取消下载。如果是强制更新,则只会提示正在下载请稍后,此时不可退出
-
如果是 wgt 包,安装时则会提示 正在安装…… 和 安装完成。安装完成会提示是否重启
-
如果是 原生安装包,则直接跳出去覆盖安装
-
下载过程中,如果退出会提示是否取消下载。如果是强制更新,则只会提示正在下载请稍后,此时不可退出
-
如果是下载完成了没有安装就退出,则会将下载完成的包保存在本地。将包的本地路径和包version保存在localStorage中
### 云函数
-
`check-version`
- 检查应用更新:
-
根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
-
先从数据库取出所有该平台(会从上下文读取平台信息)的所有线上发行更新
-
再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
-
使用上一步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新。必须同时大于这两项,因为上一次可能是wgt热更新,否则返回暂无更新
### 云函数
-
`check-version`
- 检查应用更新:
-
根据传参,先检测传参是否完整,appid appVersion wgtVersion 必传
-
先从数据库取出所有该平台(会从上下文读取平台信息)的所有线上发行更新
-
再从所有线上发行更新中取出版本最大的一版。如果可以,尽量先检测wgt的线上发行版更新
-
使用上一步取出的版本包的版本号 和传参 appVersion、wgtVersion 来检测是否有更新。必须同时大于这两项,因为上一次可能是wgt热更新,否则返回暂无更新
-
如果库中 wgt包 版本大于传参 appVersion,但是不满足 min_uni_version < appVersion,则不会使用wgt更新,会接着判断库中 app包version 是否大于 appVersion
\ No newline at end of file
uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version/check-version.param.json
浏览文件 @
a921045c
...
...
@@ -3,7 +3,7 @@
//
配置教程参考:https://uniapp.dcloud.net.cn/uniCloud/quickstart?id=runparam
{
"appid"
:
"
uni.UNIBC54A00
"
,
"appid"
:
"
__YOUR_APPID__
"
,
"appVersion"
:
"2.2.0"
,
"wgtVersion"
:
"2.2.2"
}
uni_modules/uni-upgrade-center-app/uniCloud/cloudfunctions/check-version/index.js
浏览文件 @
a921045c
...
...
@@ -124,14 +124,44 @@ exports.main = async (event, context) => {
};
/**
* 对比版本号,如需要,请自行修改判断规则
* 对比版本号,如需要,请自行修改判断规则
* 支持比对 ("3.0.0.0.0.1.0.1", "3.0.0.0.0.1") ("3.0.0.1", "3.0") ("3.1.1", "3.1.1.1") 之类的
* @param {Object} v1
* @param {Object} v2
* v1 > v2 return 1
* v1 < v2 return -1
* v1 == v2 return 0
*/
function
compare
(
v1
=
0
,
v2
=
0
)
{
// '1.2.5' > '1.2.4' 类似的版本号可以直接对比
return
v1
>
v2
?
1
:
v1
<
v2
?
-
1
:
0
;
function
compare
(
v1
=
'
0
'
,
v2
=
'
0
'
)
{
v1
=
String
(
v1
).
split
(
'
.
'
)
v2
=
String
(
v2
).
split
(
'
.
'
)
const
minVersionLens
=
Math
.
min
(
v1
.
length
,
v2
.
length
);
let
result
=
0
;
for
(
let
i
=
0
;
i
<
minVersionLens
;
i
++
)
{
const
curV1
=
Number
(
v1
[
i
])
const
curV2
=
Number
(
v2
[
i
])
if
(
curV1
>
curV2
)
{
result
=
1
break
;
}
else
if
(
curV1
<
curV2
)
{
result
=
-
1
break
;
}
}
if
(
result
===
0
&&
(
v1
.
length
!==
v2
.
length
))
{
const
v1BiggerThenv2
=
v1
.
length
>
v2
.
length
;
const
maxLensVersion
=
v1BiggerThenv2
?
v1
:
v2
;
for
(
let
i
=
minVersionLens
;
i
<
maxLensVersion
.
length
;
i
++
)
{
const
curVersion
=
Number
(
maxLensVersion
[
i
])
if
(
curVersion
>
0
)
{
v1BiggerThenv2
?
result
=
1
:
result
=
-
1
break
;
}
}
}
return
result
;
}
uni_modules/uni-upgrade-center-app/utils/check-update.js
浏览文件 @
a921045c
// 推荐再App.vue中使用
const
PACKAGE_INFO_KEY
=
'
__package_info__
'
export
default
function
()
{
// #ifdef APP-PLUS
plus
.
runtime
.
getProperty
(
plus
.
runtime
.
appid
,
function
(
widgetInfo
)
{
uniCloud
.
callFunction
({
name
:
'
check-version
'
,
data
:
{
appid
:
plus
.
runtime
.
appid
,
appVersion
:
plus
.
runtime
.
version
,
wgtVersion
:
widgetInfo
.
version
},
success
:
(
e
)
=>
{
if
(
!
e
.
result
)
return
;
const
{
code
,
message
,
is_silently
,
// 是否静默更新
url
,
// 安装包下载地址
platform
,
// 安装包平台
type
// 安装包类型
}
=
e
.
result
;
// 此处逻辑仅为实例,可自行编写
// 推荐再App.vue中使用
const
PACKAGE_INFO_KEY
=
'
__package_info__
'
export
default
function
()
{
// #ifdef APP-PLUS
plus
.
runtime
.
getProperty
(
plus
.
runtime
.
appid
,
function
(
widgetInfo
)
{
uniCloud
.
callFunction
({
name
:
'
check-version
'
,
data
:
{
appid
:
plus
.
runtime
.
appid
,
appVersion
:
plus
.
runtime
.
version
,
wgtVersion
:
widgetInfo
.
version
},
success
:
async
(
e
)
=>
{
if
(
!
e
.
result
)
return
;
const
{
code
,
message
,
is_silently
,
// 是否静默更新
url
,
// 安装包下载地址
platform
,
// 安装包平台
type
// 安装包类型
}
=
e
.
result
;
// 此处逻辑仅为实例,可自行编写
if
(
code
>
0
)
{
// 静默更新,只有wgt有
if
(
is_silently
)
{
downloadTask
=
uni
.
downloadFile
({
url
:
this
.
url
,
success
:
res
=>
{
if
(
res
.
statusCode
==
200
)
{
// 下载好直接安装,下次启动生效
plus
.
runtime
.
install
(
res
.
tempFilePath
,
{
force
:
false
});
}
}
});
return
;
}
if
(
type
===
'
native_app
'
&&
platform
.
includes
(
'
iOS
'
))
{
// iOS 跳转 AppStore 商店
plus
.
runtime
.
openURL
(
url
);
return
;
}
uni
.
setStorageSync
(
PACKAGE_INFO_KEY
,
e
.
result
)
// 跳转更新页面
uni
.
navigateTo
({
url
:
'
/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=
'
+
PACKAGE_INFO_KEY
,
fail
:
(
err
)
=>
{
console
.
error
(
'
更新弹框跳转失败
'
,
err
)
uni
.
removeStorageSync
(
PACKAGE_INFO_KEY
)
}
})
}
else
if
(
code
<
0
)
{
// TODO 云函数报错处理
console
.
error
(
message
)
}
},
fail
:
(
err
)
=>
{
// TODO 云函数报错处理
console
.
error
(
err
.
message
)
}
})
});
// #endif
// 腾讯云和阿里云下载链接不同,需要处理一下,阿里云会原样返回
const
{
fileList
}
=
await
uniCloud
.
getTempFileURL
({
fileList
:
[
url
]
});
e
.
result
.
url
=
fileList
[
0
].
tempFileURL
// 静默更新,只有wgt有
if
(
is_silently
)
{
uni
.
downloadFile
({
url
:
e
.
result
.
url
,
success
:
res
=>
{
if
(
res
.
statusCode
==
200
)
{
// 下载好直接安装,下次启动生效
plus
.
runtime
.
install
(
res
.
tempFilePath
,
{
force
:
false
});
}
}
});
return
;
}
/**
* 提示升级一
* 使用 uni.showModal
*/
// return updateUseModal(e.result)
/**
* 提示升级二
* 官方适配的升级弹窗,可自行替换资源适配UI风格
*/
uni
.
setStorageSync
(
PACKAGE_INFO_KEY
,
e
.
result
)
uni
.
navigateTo
({
url
:
`/uni_modules/uni-upgrade-center-app/pages/upgrade-popup?local_storage_key=
${
PACKAGE_INFO_KEY
}
`
,
fail
:
(
err
)
=>
{
console
.
error
(
'
更新弹框跳转失败
'
,
err
)
uni
.
removeStorageSync
(
PACKAGE_INFO_KEY
)
}
})
}
else
if
(
code
<
0
)
{
// TODO 云函数报错处理
console
.
error
(
message
)
}
},
fail
:
(
err
)
=>
{
// TODO 云函数报错处理
console
.
error
(
err
.
message
)
}
})
});
// #endif
}
/**
* 使用 uni.showModal 升级
*/
function
updateUseModal
(
packageInfo
)
{
const
{
title
,
// 标题
contents
,
// 升级内容
is_mandatory
,
// 是否强制更新
url
,
// 安装包下载地址
platform
,
// 安装包平台
type
// 安装包类型
}
=
packageInfo
;
let
isWGT
=
type
===
'
wgt
'
let
isiOS
=
!
isWGT
?
platform
.
includes
(
'
iOS
'
)
:
false
;
let
confirmText
=
isiOS
?
'
立即跳转更新
'
:
'
立即下载更新
'
return
uni
.
showModal
({
title
,
content
:
contents
,
showCancel
:
!
is_mandatory
,
confirmText
,
success
:
res
=>
{
if
(
res
.
cancel
)
return
;
// 安装包下载
if
(
isiOS
)
{
plus
.
runtime
.
openURL
(
url
);
return
;
}
uni
.
showToast
({
title
:
'
后台下载中……
'
,
duration
:
1000
});
// wgt 和 安卓下载更新
downloadTask
=
uni
.
downloadFile
({
url
,
success
:
res
=>
{
if
(
res
.
statusCode
!==
200
)
{
console
.
error
(
'
下载安装包失败
'
,
err
);
return
;
}
// 下载好直接安装,下次启动生效
plus
.
runtime
.
install
(
res
.
tempFilePath
,
{
force
:
false
},
()
=>
{
if
(
is_mandatory
)
{
//更新完重启app
plus
.
runtime
.
restart
();
return
;
}
uni
.
showModal
({
title
:
'
安装成功是否重启?
'
,
success
:
res
=>
{
if
(
res
.
confirm
)
{
//更新完重启app
plus
.
runtime
.
restart
();
}
}
});
},
err
=>
{
uni
.
showModal
({
title
:
'
更新失败
'
,
content
:
err
.
message
,
showCancel
:
false
});
});
}
});
}
});
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录