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 }