在实际开发过程当中,咱们常常能遇到App首页弹屏的需求,今天这篇文章记录一下本身在这个需求中实现的技术方案,文章所用语言为lua。 一般,每当咱们登录App后,须要从服务器请求弹屏数据,从业务类型上划分包括活动的通知,App运营的公告等,从频率上划分包括每次登录弹出、天天弹出一次、仅弹出一次等。咱们分别从这两个方面介绍: * 首先,咱们须要实现一个个的弹屏view,固然每一个弹屏view可以复用最好,不能复用就乖乖搭界面吧,这里就不细说了,每种前端框架基本都能实现,因为笔者使用的是公司自研框架,通用性就不强了,这里就不展开说明。 * 关于业务类型:这一块难点在于活动的数据结构和公告的数据结构不尽相同,最为明显的差异是活动的弹屏每每须要跳转不一样场景进行操做,而公告则关闭便可,在这里须要重点实现活动的重定向跳转,其大体结构以下:
-- 重定向配置表 local CONFIG = { ACTIVITY_1 = "func1", ... } local REDIR = {} function REDIR:init( ) end --活动一重定向方法 function REDIR:func1( ... ) -- body end
而后咱们还须要定义一个noticeManager管理,在manager中咱们须要实例化咱们的弹出view,同时弹屏须要监听用户登入登出等事件,统一在manager中处理:
-- 导入重定向配置文件 local Redirect = require(".redirect") local Events = g_Config.Events local EventBindMap = { [Events.LOGIN] = "onLoginIn", [Events.LOGOUT] = "onLoginOut", ... } local NoticeManager = {} function NoticeManager:init( ) -- 监听事件 for k,v in pairs(EventBindMap) do EventSystem:on( k, self[v], {target = self}) end end --deinit function NoticeManager:deinit( ) end function NoticeManager:onLoginOut( ) ... end function NoticeManager:onLoginIn( ) ... end
* 关于弹屏频率,对于不一样产品来讲,要求高的须要将每个活动的弹屏频率等相关数据保存到服务器,这样保证数据最大的准确性,而要求不高的能够直接在客户端实现,咱们来看看客户端实现的方法:
-- 读取弹屏次数配置 --[[ { day = "", today = { id = time }, once = { id = time } } ]] function readRecorder( ) ActivityPopRecorder = json.decode(Dict.ACTIVITY_POP_RECORDER) if not ActivityPopRecorder.today then ActivityPopRecorder.today = {} end if not ActivityPopRecorder.once then ActivityPopRecorder.once = {} end local dayStr = os.date("%Y-%m-%d", os.time()) if ActivityPopRecorder.day ~= dayStr then ActivityPopRecorder.today = {} ActivityPopRecorder.day = dayStr saveRecorder() end end function saveRecorder( ) Dict.ACTIVITY_POP_RECORDER = json.encode(ActivityPopRecorder) end readRecorder()
对于代码须要说明的是Dict为读写本地文件的对象,保存的value为string对象,这样咱们就在本地记录下了每个活动弹屏的频率,当咱们从服务端获取到数据以后,与本地记录对比,判断其是否须要弹屏,同时,在弹出后修改本地记录,当一天过去后,记录被从新归0,从新开始记录。须要注意的一点是,若是咱们删除本地Dict文件,记录也将从新归0,所以在可靠性上不如将数据存放在服务器。 利用以上几点,咱们基本能搭建出一个弹屏的开发框架,其扩展性和可读性都不错,下一章,咱们来说讲弹屏的view具体如何实现更复杂的功能和Dict的实现。