自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

從Java轉(zhuǎn)iOS第一個(gè)項(xiàng)目總結(jié)

移動(dòng)開發(fā) iOS
本人14年12月份,從網(wǎng)站開發(fā)組轉(zhuǎn)到了移動(dòng)開發(fā)組,自己的java兩年半工作經(jīng)驗(yàn)變成了Objective-C零經(jīng)驗(yàn)。2015年1月份新啟動(dòng)了一個(gè)移動(dòng)項(xiàng)目,年后因?yàn)槿耸伦儎?dòng),自己從輔助開發(fā)變成了"核心"開發(fā),目前項(xiàng)目基本接近尾聲,下面進(jìn)行總結(jié),希望對一些人能有幫助, 另外也希望iOS大牛進(jìn)行指導(dǎo)。

0.前言

本人14年12月份,從網(wǎng)站開發(fā)組轉(zhuǎn)到了移動(dòng)開發(fā)組,自己的java兩年半工作經(jīng)驗(yàn)變成了Objective-C零經(jīng)驗(yàn)。2015年1月份新啟動(dòng)了一個(gè)移動(dòng)項(xiàng)目,年后因?yàn)槿耸伦儎?dòng),自己從輔助開發(fā)變成了"核心"開發(fā),目前項(xiàng)目基本接近尾聲,下面進(jìn)行總結(jié),希望對一些人能有幫助, 另外也希望iOS大牛進(jìn)行指導(dǎo)。

1.項(xiàng)目介紹

項(xiàng)目屬于一款社區(qū)類軟件,包含小組/帖子、視頻、文章、評論、推薦搜索、即時(shí)通訊、好友、第三方登錄/分享以及推送等,涵蓋常用app的基本功能。

2.項(xiàng)目使用的第三方開源庫

http://github.ibireme.com/github/list/ios/整理了比較常用的iOS第三方組件,以及github上的統(tǒng)計(jì)。

項(xiàng)目使用了CocoaPods(類似java中的maven)管理常用的第三方庫,一些特殊的單獨(dú)引用,下面介紹下比較好用的幾個(gè)。

(1)AFNetworking

目前比較推薦的iOS網(wǎng)絡(luò)請求組件,默認(rèn)網(wǎng)絡(luò)請求是異步,通過block回調(diào)的方式對返回?cái)?shù)據(jù)進(jìn)行處理。

需要注意的是AFNetworking對服務(wù)器返回的ContentType要求比較嚴(yán)格,默認(rèn)只支持application/json的返回。所以可能需要添加對text/html返回的支持,否則可能無法獲得返回?cái)?shù)據(jù)。

另外就是文件上傳,這里推薦使用第二種:

  1. [formData appendPartWithFormData: name:]; 
  2. [formData appendPartWithFileData: name: fileName: mimeType:]; 

***種只需要傳入表單名和文件流,源碼也是根據(jù)文件流獲得對應(yīng)的文件名和文件類型,然后調(diào)用第二種方法。但是樓主遇到了使用***種方法,提交后后臺(tái)判斷為非文件上傳,無法獲得文件流。還有如果后臺(tái)是根據(jù)文件后綴文件類型,那么***種也無法使用。

AFNetworking是異步的,也可以使用同步的網(wǎng)絡(luò)請求方法.

(2).FMDB

對sqlite數(shù)據(jù)庫操作進(jìn)行了封裝,demo也比較簡單。

(3).MBProgressHUD

也是iOS項(xiàng)目常用的一個(gè)組件,用于顯示過渡效果的,比如網(wǎng)絡(luò)請求之前顯示loading,網(wǎng)絡(luò)結(jié)束隱藏loading。建議封裝在BaseViewController中,所有ViewController繼承就能使用。

(4).MJRefresh

這個(gè)是傳智播客李明杰老師的作品,自己的oc基礎(chǔ)就是看他的視頻半個(gè)周末就基本拿下了。MJRefresh主要用于刷新操作,提供了常用的刷新操作,還有刷新動(dòng)畫,用著很好用。建議把方法封裝在BaseViewController中,這樣修改刷新操作時(shí),就只需要改動(dòng)一份。(之前用的舊版MJRefresh,只支持普通的刷新,不支持動(dòng)畫,后來更新后版本變化比較大,舊的方法已經(jīng)不推薦使用了,所以還是封裝基類中使用比較好,方便以后修改)

(5).SDWebImage

也是iOS最常用的一個(gè)組件,用戶加載網(wǎng)絡(luò)圖片,可以緩存到本地。大概原理時(shí),***次加載后,會(huì)根據(jù)url加密作為文件名緩存在本地,如果再次加載圖片時(shí),就直接從本地加載。用著也比較簡單。這里也分享遇到的一個(gè)問題,先從網(wǎng)絡(luò)加載一張小圖,然后小圖作為占位圖,再從網(wǎng)絡(luò)加載一張大圖。

  1. [imageView sd_setImageWithURL:[NSURL URLWithString:imageURLString] placeholderImage:DefaultPostPic]; 
  2. [imageView sd_setImageWithURL:[NSURL URLWithString:_bigImageURLStringArray[i]] placeholderImage:imageView.image options:SDWebImageDelayPlaceholder completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
  3. }]; 

(6).RDVTabBarController

一個(gè)TabBar組件,可以方便設(shè)置底部菜單的文字圖片,點(diǎn)擊效果,小紅點(diǎn)提示等。

(7).Toast

類似android的toast提示效果,封裝在BaseViewController中,需要的地方進(jìn)行提示。

(8).XMPPFramework

iOS唯一的xmpp類庫,作者在去年8月份添加了xep-0198協(xié)議支持(流管理,用于xmpp斷線重連),但是通過pod進(jìn)行更新時(shí),無法下載到***版本,可能0198還沒有完善好,無法作為正式版。

(9).TPKeyboardAvoiding

用戶鍵盤彈出自動(dòng)計(jì)算高度,進(jìn)行屏幕滾動(dòng)操作。

(10).AMR

做即時(shí)通訊的音頻處理,目前我們的即時(shí)通訊使用的錄音文件是m4a,便于web端的音頻播放。

(11).TQRichTextView

用于做富文本視圖控件顯示,用于即時(shí)通訊的表情顯示,以及資源評論的富文本顯示。

(12).CSGrowingTextView

用作即時(shí)通訊文本框和評論文本框使用,可以顯示多行輸入。

(13).MJExtension

也是李明杰老師的作品,用于json轉(zhuǎn)model進(jìn)行使用,有點(diǎn)類似于java中谷歌的Gson。轉(zhuǎn)換效率據(jù)說也很高,使用也比較簡單,只要前后臺(tái)約定好,json直接就轉(zhuǎn)成了model。一個(gè)工作多年的iOS朋友說,一個(gè)項(xiàng)目主要的是對model層的管理,他推薦的是Mantle。不過MJ這個(gè)更輕量級點(diǎn),用著也更加簡單。

3.工具和插件介紹

Xcode

iOS開發(fā)的官方工具,也沒別的選擇。有些功能做的確實(shí)挺帥的,比如StroyBoard的拖拽事件綁定。不爽的地方就是沒有代碼格式化,另外點(diǎn)擊方法,可能跑到另外一個(gè)類中了?。×硗庾筮叺哪夸浺膊粫?huì)自動(dòng)發(fā)生變化,定位到對應(yīng)文件,需要command+shift+j

SimPholders2

可以快速找到模擬器對應(yīng)的沙盒目錄,啟動(dòng)后右側(cè)頂部工具欄有個(gè)類似關(guān)閉按鍵的按鈕,顯示最近的幾個(gè)應(yīng)用,點(diǎn)擊就進(jìn)入到了對應(yīng)的沙盒目錄。

VVDocumenter-Xcode

xcode工具,///生成注解模板,xcode這功能都不給集成,唉。

其他的基本就不用介紹了,有的也不怎么好用。SVN可以使用Cornerstone,Git可以使用SourceTree,sqlite可以使用SQLite Professional(不過是收費(fèi)的,免費(fèi)的只能查看),還可以用火狐瀏覽器的sqlite插件。

#p#

4.集成友盟

友盟,提供了App和運(yùn)用的一站式解決方案。公司上個(gè)移動(dòng)項(xiàng)目用到了友盟的推送服務(wù),這個(gè)項(xiàng)目中, 還使用了分享,第三方登錄的功能,自己也親自參與到了相關(guān)集成。友盟的開發(fā)者文檔還算是比較全的,遇到問題可以聯(lián)系客服或者到友盟的論壇找解決方案。

(1).關(guān)于推送

iOS推送分為本地推送和遠(yuǎn)程推送,本地推送是指本地自己彈出信息,另外一個(gè)就是遠(yuǎn)程推送,當(dāng)應(yīng)用未啟動(dòng)時(shí),也能收到相關(guān)推送信息。我們項(xiàng)目沒有使用本地推送,使用的都是友盟的遠(yuǎn)程推送。包括消息(聊天)和通知(用戶信息通知)中。用戶在聊天過程中,手機(jī)除了發(fā)送即時(shí)通訊以外,也調(diào)用后臺(tái)接口,發(fā)送友盟推送。另外用戶的帖子,評論,關(guān)注,點(diǎn)贊等都會(huì)由后臺(tái)調(diào)用友盟的推送。

友盟推送(另外一個(gè)域名)包括單播,列播,和廣播,其中廣播限定次數(shù)每天3次,可以和友盟申請?zhí)岣叽螖?shù),其他不限定次數(shù),目前來看單播速度還是挺快的。使用友盟推送,需要在蘋果開發(fā)者賬號中,新建兩個(gè)推送證書,提交給友盟(友盟有詳細(xì)的文檔,可以參考)??梢栽谟衙撕笈_(tái),把測試設(shè)備的deviceToken加到友盟推送的后臺(tái),從友盟后臺(tái)發(fā)起推送。(需要64位token,需要通過方法進(jìn)行計(jì)算,直接在xcode或者ituns中拿到token不行)

推送的大概流程就是,手機(jī)在***次啟動(dòng)app的時(shí)候開啟推送服務(wù),手機(jī)在啟動(dòng)app的時(shí)候,注冊友盟服務(wù),同時(shí)把deviceToken提交到自己的后臺(tái),后臺(tái)可以在需要的時(shí)候拿著deviceToken調(diào)用友盟的推送接口,友盟再去發(fā)起蘋果的推送服務(wù),使對應(yīng)的設(shè)備收到遠(yuǎn)程推送信息。

(2).關(guān)于第三方登錄和分享

這塊兒都在友盟的社會(huì)化分享中,里面提供了比較全面的文檔。建議第三方分享模塊不用自己特殊設(shè)計(jì),可以使用友盟的默認(rèn)分享模塊(我們項(xiàng)目的分享模塊自己進(jìn)行了設(shè)計(jì),包括了收藏,所以整塊都需要自定義寫UI和寫分享代碼)。關(guān)于友盟的第三方登錄和分享需要注意的時(shí),QQ和微信登錄分享,都需要手機(jī)上安裝應(yīng)用,appstore審核會(huì)卡這點(diǎn),所以需要判斷手機(jī)是否安裝應(yīng)用,隱藏沒有安裝應(yīng)用的圖標(biāo),這塊兒友盟的sdk已經(jīng)有相關(guān)的判斷方法(應(yīng)該是友盟集成了QQ和微信sdk,QQ和微信sdk提供了判斷方法)。

第三方登錄分享需要到相關(guān)的平臺(tái)注冊開發(fā)者賬號。微信開發(fā)者賬號(注意不是訂閱號)第三方登錄需要交錢才能開通,可以支持微信和朋友圈分享。QQ開發(fā)者賬號可以支持QQ和QQ空間分享(QQ微博好像需要微博開發(fā)者賬號)。新浪微博需要微博開發(fā)者賬號。QQ分享開發(fā)階段需要把測試賬號加成開發(fā)者賬號的好友才能測試,微博也類似。

第三方登錄自己遇到了QQ提示不是***版的文本,在友盟論壇中找到了解決方案。

第三方登錄,我們項(xiàng)目集成了QQ,微信,新浪微博登錄。三個(gè)平臺(tái)都能獲得用戶的screen_name(用戶名稱),以及對應(yīng)的平臺(tái)唯一的id,其中QQ和微信都是openid,新浪是userid。

第三方分享,文檔提供了分享圖片,視頻,語音。如果是分享url,需要設(shè)置對應(yīng)平臺(tái)的分享地址,參考解決方案,比如

  1. [UMSocialData defaultData].extConfig.qqData.url = shareUrl; 
  2. [UMSocialData defaultData].extConfig.qzoneData.url = shareUrl; 
  3. [UMSocialData defaultData].extConfig.wechatSessionData.url = shareUrl; 
  4. [UMSocialData defaultData].extConfig.wechatTimelineData.url = shareUrl; 

另外分享到QQ空間,必須指定一張圖片,否則不能分享成功。

第三方分享建議封裝到一個(gè)類中,我們項(xiàng)目是幾個(gè)詳情頁都有分享,評論,舉報(bào),收藏,點(diǎn)贊等功能。封裝在一個(gè)BaseDetailViewController中的,相關(guān)頁面繼承,同時(shí)傳入對應(yīng)的資源類型,只用維護(hù)一份代碼。

5.即時(shí)通訊

即時(shí)通訊網(wǎng)上有第三方的解決方案,比如環(huán)信,融云等。我們是自己搭的xmpp服務(wù)器,服務(wù)器使用的tigase,之前寫過相關(guān)的博客,自己去年也做了對應(yīng)的webim。前段時(shí)間看了環(huán)信webim的sdk,使用的也是strophe的js類庫,相關(guān)實(shí)現(xiàn)跟我們的差不多,但是自己搭建xmpp會(huì)遇到了不少問題,比如丟消息!所以如果想比較快速的實(shí)現(xiàn)im,推薦使用第三方的解決方案。

移動(dòng)端的丟消息大概是這個(gè)樣子。A和B通訊,A發(fā)了一條消息給服務(wù)器,服務(wù)器發(fā)給B,但是B網(wǎng)絡(luò)不好掉線了,而服務(wù)器卻不知道B退出了(B正常退出會(huì)給服務(wù)器發(fā)下線通知),所以消息丟失了。XMPP中有xep-0184協(xié)議(消息回執(zhí)),A給B發(fā)消息,消息體中帶一行代碼(要求消息回執(zhí)),當(dāng)B收到消息后發(fā)送一條回執(zhí),證明我收到了。后來XMPP又有了xep-0198協(xié)議(流管理),斷線后快速重鏈,同時(shí)判斷一定時(shí)間收不到消息,就把消息寫離線消息,減少丟消息情況。但是可能網(wǎng)絡(luò)情況復(fù)雜,加上各種不確定因素,還會(huì)出現(xiàn)丟消息的問題。目前比較靠譜的方法就是存所有的聊天記錄,由手機(jī)端根據(jù)時(shí)間點(diǎn)去數(shù)據(jù)庫拉消息,只要?jiǎng)e人發(fā)出的消息就不會(huì)丟。

這次即時(shí)通訊模塊進(jìn)行了相關(guān)改動(dòng),也是參考了之前開發(fā)人員的一些建議。比如用戶返回home的時(shí)候,斷開xmpp連接(iOS進(jìn)入后臺(tái)后,只有5秒的處理時(shí)間,特殊方法可延長到10分鐘,如果內(nèi)存不夠,應(yīng)用隨時(shí)就被殺死了)。所以返回home時(shí)就斷開,進(jìn)入應(yīng)用再連接。同時(shí)應(yīng)用使用狀態(tài)下,有心跳檢測,判斷是否保持連接。

考慮到iOS的特殊性,我們采取了xmpp和遠(yuǎn)程推送都走的方法,推送的自定義消息體和xmpp消息體一樣,消息的處理方法一樣。用戶聊天發(fā)送xmpp消息的同時(shí)也調(diào)用我們的消息推送接口調(diào)用友盟push(push可以設(shè)置過期時(shí)間,避免特殊情況,推送延時(shí),聊天結(jié)束了才收到推送)。一是解決iOS應(yīng)用未啟動(dòng)時(shí)的推送接收,二是解決xmpp丟消息的問題。

關(guān)于推送,AppDelage中有兩個(gè)方法,一個(gè)是使用中收到推送,不會(huì)提示,會(huì)直接處理推送信息。另外是程序非使用狀態(tài),收到推送,會(huì)進(jìn)行提示,可以點(diǎn)擊推送消息進(jìn)入應(yīng)用,獲取這一條推送消息的推送消息(需要注意,點(diǎn)擊推送啟動(dòng)應(yīng)用拿到信息時(shí)view還沒有加載,消息不能立刻處理)。

android端因?yàn)槭钦婧笈_(tái),可以后臺(tái)一直保持運(yùn)行,無論收到xmpp消息還是友盟推送,都可以自己進(jìn)行處理,然后自己彈一個(gè)本地推送(也有弊端,如果android程序殺死,就無法接受消息和推送)。iOS端因?yàn)楹笈_(tái)不可控,所以推送使用遠(yuǎn)程推送,進(jìn)入應(yīng)用連接xmpp再收全部離線消息(不保證友盟推送能否保證及時(shí))。當(dāng)然大部分都還是正常情況,網(wǎng)絡(luò)情況比較好的條件下,就實(shí)時(shí)收到了xmpp的消息或者遠(yuǎn)程推送。我們又不是QQ和微信,只要保證用戶看到的數(shù)據(jù)能保持一致性就行了(所以QQ和微信就是diao?。?。

根據(jù)測試反饋的情況,iOS這個(gè)應(yīng)用的丟消息情況比上個(gè)應(yīng)用有一定改善。具體情況再進(jìn)一步觀察把。

我們的即時(shí)通訊也包括語音和圖片,采用的是http的解決方案(xmpp也支持二進(jìn)制的傳輸,但是估計(jì)沒人那樣用)。具體流程就是先把附件傳到附件服務(wù)器拿到附件服務(wù)器的地址,再封裝到消息體。接收方收到消息解析的時(shí)候,再從附件服務(wù)器拿到對應(yīng)的資源,加載到本地。 同時(shí)屏蔽,取消屏蔽等一些實(shí)時(shí)操作也都會(huì)發(fā)xmpp,***時(shí)間雙方更新狀態(tài)。

6.項(xiàng)目總結(jié)

目前項(xiàng)目已經(jīng)接近尾聲了,再過不到半月就要上線了。自己算是項(xiàng)目的主要負(fù)責(zé)人了。項(xiàng)目前期iOS和android有一周多前期準(zhǔn)備和框架搭建,另外就是我根據(jù)頁面原型,定義接口文檔開發(fā)計(jì)劃,協(xié)調(diào)開發(fā)??赡艽蠹翼?xiàng)目經(jīng)驗(yàn)也都不多把,框架和接口或多或少都會(huì)有點(diǎn)問題,隨著經(jīng)驗(yàn)慢慢積累肯定都會(huì)越來越好的。關(guān)于iOS的總結(jié)下:

框架搭建的時(shí)候,要考慮好App中各功能點(diǎn)的實(shí)現(xiàn)方案。設(shè)計(jì)好相關(guān)文件目錄,封裝相關(guān)類文件。

封裝整理相關(guān)方法,比如BaseViewController中包括,基本ui,頂部導(dǎo)航條,左按鈕,右按鈕,標(biāo)題,相關(guān)點(diǎn)擊事件,顯示/隱藏loading,網(wǎng)絡(luò)請求失敗統(tǒng)一處理方法,上拉/下拉刷新綁定,刷新顯示/隱藏。分析項(xiàng)目中的功能相同模塊,封裝對應(yīng)操作,相同功能代碼維護(hù)一份。

考慮好刷新機(jī)制,比如A頁面進(jìn)入B頁面,B更新后,返回后A頁面的刷新,如果采用block/delegate的方法,可以統(tǒng)一進(jìn)行設(shè)計(jì)?;蛘叨鄠€(gè)頁面之間的數(shù)據(jù)刷新,采用通知的方式(KVO),進(jìn)行更新操作。盡量開發(fā)階段,就把可能出現(xiàn)的問題提前解決。

確定是否進(jìn)行相關(guān)頁面統(tǒng)計(jì),比如加友盟的頁面統(tǒng)計(jì),需要設(shè)置相關(guān)view的viewWillAppear和viewWillDisappear()

ViewController中初始化view和數(shù)據(jù)請求后刷新view代碼分離,封裝整理好網(wǎng)絡(luò)請求前和請求后的操作,考慮好下拉刷新頁面和上拉加載更多的相關(guān)數(shù)據(jù)請求和處理。考慮有網(wǎng)狀態(tài)下的數(shù)據(jù)緩存以及無網(wǎng)狀態(tài)下的緩存數(shù)據(jù)加載

提前做好相關(guān)頁面的跳轉(zhuǎn),代碼解耦,不斷優(yōu)化和重構(gòu)代碼。發(fā)現(xiàn)問題或者有更好的解決方案,盡量早期就進(jìn)行修改,避免修修補(bǔ)補(bǔ),方便后期維護(hù)和擴(kuò)展。在可以接受的情況下,可以犧牲一些系能,保持邏輯簡單,便于維護(hù)。

通過代碼寫view計(jì)算坐標(biāo)時(shí),盡量參考上一個(gè)元素的坐標(biāo)和寬高,這樣當(dāng)一個(gè)元素位置或?qū)捀甙l(fā)生變化時(shí),其他元素基本都能隨著發(fā)生變化。

數(shù)據(jù)處理能放在服務(wù)器端處理就由服務(wù)器端處理,前臺(tái)就進(jìn)行無腦顯示。

考慮程序的兼容性,32位和64位一些變量的值不同,注意值的越界問題。注意程序的內(nèi)存問題,和使用過程中的內(nèi)存變化。

考慮信息的安全性,沙盒存儲(chǔ)的信息可以被查看修改,重要信息請加密。

責(zé)任編輯:chenqingxiang 來源: cocoachina
相關(guān)推薦

2023-09-21 22:43:17

Django框架

2010-08-04 13:16:23

Flex項(xiàng)目

2010-07-30 14:50:38

Flex項(xiàng)目

2022-09-02 15:22:32

Vue3.2技術(shù)代碼

2025-04-11 08:40:00

FastAPIAPIWeb 框架

2022-08-17 12:09:29

Vue3.2代碼

2025-01-13 00:00:10

SwaggerAI項(xiàng)目

2021-04-07 13:38:27

Django項(xiàng)目視圖

2018-11-08 13:53:15

Flink程序環(huán)境

2011-03-03 21:04:08

bug程序員

2011-03-21 14:24:13

Debian 6

2013-01-14 09:44:58

JavaScriptJSJS框架

2010-07-30 14:58:06

Flex應(yīng)用

2012-02-08 11:15:38

HibernateJava

2021-03-24 08:00:44

項(xiàng)目Vue 3Typescript

2013-10-30 22:10:28

Clouda程序

2022-10-17 10:28:05

Web 組件代碼

2009-10-23 09:21:08

2009-09-22 10:00:08

曙光BBSBBS站

2011-12-29 15:18:54

開放平臺(tái)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號