從財(cái)富幫項(xiàng)目啟動(dòng)到現(xiàn)在也半年多了,開發(fā)過程中零零散散地也積累了一些經(jīng)驗(yàn)心得,今天把財(cái)富幫iOS客戶端的一些設(shè)計(jì)思路跟大家分享一下,權(quán)當(dāng)拋磚引玉耕餐。因?yàn)榉窒淼氖撬悸范簧婕熬唧w實(shí)現(xiàn)細(xì)節(jié),所以也同樣適用于Android哦辟狈。
Debug頁(yè)面
一個(gè)好的App除了實(shí)現(xiàn)正常的功能外肠缔,還應(yīng)該有一個(gè)良好的debug機(jī)制。這個(gè)Debug機(jī)制應(yīng)該用一個(gè)隱藏的不易被普通用戶發(fā)現(xiàn)的方式去實(shí)現(xiàn),值得慶幸的是iOS和Android系統(tǒng)都提供了Url Scheme技術(shù)桩砰,用來從外界打開App的一個(gè)具體頁(yè)面拓春。
財(cái)富幫目前的Debug頁(yè)面對(duì)一些不易在運(yùn)行時(shí)調(diào)試的功能添加了輔助功能释簿,比如推送亚隅。對(duì)于推送,我們?cè)O(shè)定了推送日志庶溶,用來收集服務(wù)器推送過來的信息煮纵。分析這些消息可以幫助我們精準(zhǔn)的分析出問題到底出自服務(wù)器端還是客戶端甚至問題的具體原因。另外偏螺,對(duì)于推送我們還設(shè)定了賬號(hào)綁定機(jī)制行疏,這個(gè)綁定于設(shè)備的賬號(hào)主要被用來做單推測(cè)試。單推測(cè)試是推送測(cè)試中很重要的一個(gè)環(huán)節(jié)套像,一般情況下只要單推測(cè)試過了酿联,群推就是n個(gè)單推而已。除此之外夺巩,財(cái)富幫Debug頁(yè)面還設(shè)置了切換App運(yùn)行環(huán)境的功能贞让,把這個(gè)功能放到Debug頁(yè)面是因?yàn)檫@是一個(gè)敏感操作,一般用戶不應(yīng)該擁有這個(gè)權(quán)限柳譬,甚至不應(yīng)該知道這個(gè)功能喳张。這個(gè)功能主要是為了方便開發(fā)人員和測(cè)試人員用一個(gè)安裝包去切換環(huán)境以測(cè)試App在不同環(huán)境下的表現(xiàn),免去了開發(fā)人員針對(duì)不同的環(huán)境要打不同安裝包的瑣碎工作美澳。
客戶端多環(huán)境切換
在實(shí)現(xiàn)這個(gè)功能之前销部,我們首先要思考一個(gè)問題,測(cè)試環(huán)境制跟、正式環(huán)境以及開發(fā)環(huán)境和預(yù)發(fā)布環(huán)境等真正的區(qū)別在哪里舅桩?仔細(xì)想想后不難發(fā)現(xiàn),UI交互雨膨、業(yè)務(wù)流程等幾乎是一模一樣的擂涛,唯一不同的就是請(qǐng)求接口的Url,和某些第三方的App key哥放,App id等歼指,比如說推送的App Key,微信分享的App id之類的甥雕。
為了實(shí)現(xiàn)環(huán)境切換功能踩身,我們首先要實(shí)現(xiàn)一個(gè)管理請(qǐng)求Url的類,我們可以暫時(shí)把這個(gè)類叫做CFBRequestUrlManager社露,它主要負(fù)責(zé)根據(jù)不同的環(huán)境返回不同的請(qǐng)求url挟阻。然而,我們到底該如何標(biāo)記環(huán)境呢?很簡(jiǎn)單附鸽,客戶端本地存儲(chǔ)一個(gè)變量app_env就可以⊥哑矗現(xiàn)在數(shù)據(jù)層就基本ok了,我們還需要在Debug頁(yè)面加上一個(gè)分段控件用來讓用戶操作坷备,記得在分段控件切換環(huán)境時(shí)更新下app_env就可以∠ㄅǎ現(xiàn)在關(guān)鍵的問題來了,切換環(huán)境后除了更新app_env省撑,我們還需要做其它事情么赌蔑?當(dāng)然需要了,想想推送竟秫,推送環(huán)境的初始化注冊(cè)等操作都是在App啟動(dòng)時(shí)做的娃惯,再想想App里某些模塊的緩存,如果不清除掉的話肥败,我們切換到了新環(huán)境卻還在用著上一個(gè)環(huán)境的緩存趾浅,這會(huì)引起多大的bug哇;這里只是舉個(gè)例子馒稍,真實(shí)情況下應(yīng)該還有很多具體的問題皿哨。簡(jiǎn)言之,我們需要在App切換環(huán)境之后做好清除緩存等工作筷黔。最后也是最重要的往史,為了讓推送等需要在App啟動(dòng)時(shí)才能執(zhí)行的邏輯實(shí)時(shí)觸發(fā),我們應(yīng)該退出App佛舱。
推送debug
1.推送日志的建立
推送的使用場(chǎng)景往往是在App發(fā)布之后椎例,這個(gè)時(shí)候我們的App需要根據(jù)服務(wù)器推送過來的信息來決定App展示什么樣的頁(yè)面,執(zhí)行什么樣的邏輯请祖;此時(shí)订歪,我們是無法用IDE來Debug的。倘若能針對(duì)具體的業(yè)務(wù)邏輯建立一套自己的推送日志肆捕,那么我們調(diào)試推送功能時(shí)將事半功倍刷晋。財(cái)富幫目前的推送有好幾類,以資訊推送來做個(gè)簡(jiǎn)單例子慎陵,對(duì)于資訊推送我們很關(guān)心推送過來的點(diǎn)擊url眼虱,以及是否允許分享,分享url等席纽,我們把這些信息都寫入日志的話捏悬,假如某條資訊推送過來出現(xiàn)了打開為空白頁(yè)面,或者不允許的分享的卻顯示了分享按鈕等bug時(shí)润梯,我們就能很容易地定位到錯(cuò)誤过牙,然后迎刃而解之甥厦。
2.別名賬號(hào)的建立
有的推送功能提供商在測(cè)試單推功能時(shí)是不允許使用deviceToken的,它們需要一個(gè)設(shè)備別名寇钉,財(cái)富幫現(xiàn)在所使用的信鴿推送就是這樣刀疙。為了測(cè)試單推功能,我們?cè)贒ebug頁(yè)面設(shè)定了一個(gè)綁定推送別名的功能以方便測(cè)試單推功能扫倡,必須要提醒的是谦秧,設(shè)備別名的綁定時(shí)機(jī)是在App 啟動(dòng)的時(shí)候,所以當(dāng)我們綁定了新的設(shè)備別名之后镊辕,必須先重啟App才可以重新測(cè)試油够。
托管式網(wǎng)絡(luò)請(qǐng)求類
在移動(dòng)客戶端的開發(fā)過程中蚁袭,我們需要經(jīng)常處理網(wǎng)絡(luò)請(qǐng)求征懈,關(guān)于一個(gè)網(wǎng)絡(luò)請(qǐng)求我們大概有三個(gè)關(guān)注的時(shí)間點(diǎn),請(qǐng)求開始揩悄,請(qǐng)求成功或失敗卖哎。對(duì)于大部分請(qǐng)求,我們都需要做同一件事情删性,請(qǐng)求開始時(shí)顯示loading動(dòng)畫亏娜,成功或失敗后移除loading動(dòng)畫,失敗后根據(jù)失敗原因顯示不同的UI蹬挺,如果是因?yàn)槌瑫r(shí)原因维贺,頁(yè)面應(yīng)該提供一個(gè)非常重要的刷新按鈕,點(diǎn)擊之后能重新請(qǐng)求數(shù)據(jù)巴帮;如果是網(wǎng)絡(luò)情況不好或服務(wù)器內(nèi)部錯(cuò)誤溯泣,則應(yīng)該根據(jù)錯(cuò)誤原因顯示相應(yīng)的提示頁(yè)面,此時(shí)不需要提供刷新按鈕榕茧。
由于在一個(gè)App內(nèi)垃沦,loading視圖,網(wǎng)絡(luò)超時(shí)視圖用押,以及服務(wù)器錯(cuò)誤視圖基本上都是統(tǒng)一風(fēng)格的肢簿,所以對(duì)于這三個(gè)視圖的具體表現(xiàn),我們完全可以提供抽象接口去實(shí)現(xiàn)蜻拨。我們可以根據(jù)一個(gè)網(wǎng)絡(luò)請(qǐng)求對(duì)象是否實(shí)現(xiàn)了相關(guān)接口來決定這個(gè)網(wǎng)絡(luò)請(qǐng)求對(duì)象是否需要托管池充,如果實(shí)現(xiàn)了則為托管狀態(tài),執(zhí)行相應(yīng)的托管邏輯缎讼,也就是請(qǐng)求開始顯示loading視圖收夸,請(qǐng)求失敗顯示相應(yīng)的錯(cuò)誤提示頁(yè)面。這種情況一般適合于一個(gè)頁(yè)面的主網(wǎng)絡(luò)請(qǐng)求休涤,所謂主網(wǎng)絡(luò)請(qǐng)求就是請(qǐng)求下來的數(shù)據(jù)能夠渲染這個(gè)頁(yè)面的大部分區(qū)塊的UI咱圆。對(duì)于一些小的附帶請(qǐng)求笛辟,只影響局部UI的請(qǐng)求,我們不應(yīng)該實(shí)現(xiàn)托管序苏,以免影響頁(yè)面整體的視覺表現(xiàn)手幢。這樣我們就初步實(shí)現(xiàn)了托管式網(wǎng)絡(luò)請(qǐng)求類,但是如果每個(gè)請(qǐng)求我們都需要實(shí)現(xiàn)一次接口那不是很累么忱详?!
所以剛才設(shè)計(jì)的網(wǎng)絡(luò)請(qǐng)求類應(yīng)該只能是一個(gè)基類围来。一般情況下,一個(gè)App里的網(wǎng)絡(luò)請(qǐng)求loading圖匈睁,網(wǎng)絡(luò)請(qǐng)求超時(shí)圖應(yīng)該是相同的监透,為了貫徹DRY原則,我們還需要設(shè)計(jì)一個(gè)子類繼承剛才的基類航唆,這個(gè)子類應(yīng)該實(shí)現(xiàn)相應(yīng)的loading視圖胀蛮,網(wǎng)絡(luò)超時(shí)視圖邏輯接口。最后糯钙,為了讓基類更健壯靈活粪狼,我們還需要提供一個(gè)BOOL標(biāo)記來決定是否啟用托管,如果啟用任岸,則執(zhí)行l(wèi)oading再榄,網(wǎng)絡(luò)視圖等邏輯,反之享潜,則不執(zhí)行困鸥。