You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

81 lines
3.5 KiB

package user
import (
"strings"
"yunyan/comm"
"yunyan/pb"
)
// @Summary 获取渠道包信息
// @Description 获取渠道包信息并校验升级:传了 version 时返回 needupdate/forceupdate/reviewing 三个判定结果
// @Tags User
// @Accept json
// @Produce json
// @Param user body pb.UserGetChannelAppReq true "获取渠道包信息"
// @Success 200 {object} comm.HttpResult{data=pb.UserGetChannelAppResp} "成功返回"
// @Router /api/home/user_getchannelapp [post]
//
// 升级判定一律由服务端算:版本号比较要逐段按整数比("1.10.0" > "1.9.0",按字符串比会判反),
// 各客户端各写一遍必然有实现不一致,故统一收敛到 comm.CompareVersion / NeedForceUpdate。
func (this *apiComp) GetChannelApp(session comm.IUserSession, req *pb.UserGetChannelAppReq) (resp *pb.UserGetChannelAppResp, errdata *pb.ErrorData) {
rows, err := this.module.model.loadChannelApps()
if err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_DBError,
Message: err.Error(),
}
return
}
rel, err := this.module.model.loadAppRelease()
if err != nil {
errdata = &pb.ErrorData{
Code: pb.ErrorCode_DBError,
Message: err.Error(),
}
return
}
cfg := pickChannelAppCfg(rows, req.Channel)
app := toPbChannelApp(req.Channel, cfg, rel, req.Version, officialChannelAddress(rows))
resp = &pb.UserGetChannelAppResp{App: app}
address := ""
if app != nil {
address = app.Address
}
resp.Needupdate, resp.Forceupdate, resp.Reviewing = evalChannelUpgrade(rel, cfg, req.Channel, req.Version, address)
return
}
// evalChannelUpgrade 由应用发版配置、本渠道行、客户端版本算出三个升级判定(2026-09-23 口径)。
//
// - 版本号按平台取(iOS 渠道读 ios_version / ios_min_version),见 comm.PlatformOfChannel。
// - 推荐更新 = 客户端 < 该平台线上版本;强制更新 = 开关开 且 客户端 < 该平台最低版本
// (最低版本留空 = 线上版本);强更必然意味着有更新。
// - 渠道行状态不是「已上架」(审核中 / 已下架)时**不推送推荐更新**:商店里还是旧包,提示了
// 用户也下不到新版。强更不受这条限制——它的地址已经由回退链换成官方包。
// - address 是最终算出的下载地址(toPbChannelApp 的 Address):为空说明没有任何可去的地方,
// 两种更新都不提示。强更也不例外:一个点了没反应又关不掉的弹窗等于把用户锁死。
//
// 未配置或客户端没上报版本时全部为 false —— 客户端照旧走「无更新」分支,
// 绝不能因为拿不到版本就判成强更,那会把所有老客户端挡在门外。
func evalChannelUpgrade(rel *comm.AppRelease, ch *comm.ChannelApp, channel int32, clientVer, address string) (need, force, reviewing bool) {
if rel == nil || strings.TrimSpace(clientVer) == "" {
return false, false, false
}
platform := comm.PlatformOfChannel(channel)
need = rel.NeedUpdateOn(clientVer, platform)
force = rel.NeedForceUpdateOn(clientVer, platform)
// 强更必然意味着有更新可用:即便运营忘了把线上版本填得比最低支持版本高,也不该出现
// 「必须更新但没有更新」这种客户端无法处理的组合。
if force {
need = true
}
if ch != nil && ch.Status != comm.ChannelStatusOnline && !force {
need = false
}
if strings.TrimSpace(address) == "" {
need, force = false, false
}
reviewing = rel.IsReviewing(clientVer)
return
}