假设我有一个移动应用程序,它有一个类似于Clash Royale或Duolingo的每日挑战系统。 每个每日挑战都是不同的,例如,一个可能要求用户完成游戏,而另一个可能要求用户在应用程序上停留一段时间。 当满足增加用户特定每日挑战进度的标准时,会向 API 发出请求以更新
database
中的用户每日挑战。
如果我将每个每日挑战存储在数据库中,并将每个挑战 ID 存储在前端中,将来如果我想创建其他挑战,我还必须为下一个前端发布版本更新前端中的挑战 ID 列表,所以两者保持同步。 但是,旧版本的前端不会有更新的挑战列表,那么克服这个问题的正确方法是什么?
这是一个非常广泛的主题,有很多方法,具体取决于您的实际项目架构(前端和后端)和业务逻辑。
1 - 您可以通过 API 调用(将用户应用程序 semver 字符串与服务器上所需的字符串进行比较)在加载期间比较服务器版本,从而强制要求用户通过商店更新其应用程序。许多应用程序使用这种简单的技术来确保前端具备正常运行所需的一切。
2 - 您可以使用推送更新(应用程序无需在后台任务中从商店下载即可更新)。您可以在线找到大量文档(例如:apple 的文档)。
3 - 您应该避免在前端使用静态 ID,对与前端 semver 字符串相关的日常任务使用抽象和通用模型。当用户登录应用程序时,使用 API 调用,该调用根据作为参数传递的 semver 字符串(较低或等于)返回一组可能的任务,并在本地缓存此列表。 由于您的应用程序将仅获取已实现的前端任务,因此使用旧版本的用户不会遇到任何问题。根据您的架构和项目,您还可以在模型中附加所有必需的资源(例如 url:svgs、图像、视频...)。 您还可以基于更复杂的数据库模型制定逻辑方法,这些模型可以满足您想到的任何类型的挑战。 例如:使用抽象运算符
{ title: "...", kind: "TIMER", operator: "gte", target: "IN_APP_TIME", value: 1800 // 30 minutes in seconds, version: "1.2.3", resources: ... }
使用 2 和 3 应该是满足您特定需求的理想方法。
旁注,您应该通过套接字和服务器事件使用服务器验证。仅仅依赖前端肯定会导致用户作弊。如果验证任务只需要 API 调用,那么很容易绕过。