在實際開發過程當中,咱們常常能遇到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的實現。