【原】博客園第三方客戶端-i博客園App開源 本文轉載請註明出處 —— polobymulberry-博客園 1.前言 目前i博客園App已經更新到2.0.0版本了,使用了最新的博客園Web API。相比於第一個版本,添加了很多新的功能,也修改了很多功能。整體來說改動比較大,代碼也比較混亂。所以趁著 ...
【原】博客園第三方客戶端-i博客園App開源
本文轉載請註明出處 —— polobymulberry-博客園
1.前言
目前i博客園App已經更新到2.0.0版本了,使用了最新的博客園Web API。相比於第一個版本,添加了很多新的功能,也修改了很多功能。整體來說改動比較大,代碼也比較混亂。所以趁著清明假期,把代碼好好整理了一番。目前基本的架構已成型(當然,後期還需要不斷優化),但App基本功能方面還有很多需要添加的,後面會集中把App功能完善。
上面簡單介紹了下目前App的情況,回到開源的話題來。開源這個App源碼其實是我從一開始就有的願景,不過當初代碼很混亂,所以一直拖啊拖,中間也有很多實驗室的事情,不過我一直也沒放棄過要開源的這個想法。開源對我來說利大於弊的:
- 雖然我不是什麼大牛,開源的代碼也不是什麼牛逼的項目。但是我覺得成為大牛總是有過程的,我希望我寫博客或者開源代碼可以記錄下這些過程。很多牛人,比如說郭曜源大神(YYKit),等項目成熟了再一起發佈出來。但是我觀念不一樣,我覺得開源代碼也是一個產品,如果從做產品的思維來說,很重要的一點就是迭代開發,當我完成產品的基本功能後,我就應該去上線,和用戶交流,再繼續迭代開發下一版本的產品。目前我覺得我的代碼整體架構差不多了,所以我覺得可以放到GitHub上了。
- 開源代碼的目的主要還是為了想更多的人參與進來,本質也是為了督促自己學習。目前App功能還不完善,個人的力量也有限,希望能有更多的人加入進來,眾人拾柴火焰高。
- 另外將自己的代碼暴露出來,讓大家批評指正,也是增強自己技術的有效途徑。如果有幸能得到大神指點,那就一日千里了,哈哈(做夢吧你)!其實我覺得自己之前一直蒙頭做自己的事,不和外界交流,這樣不好,容易成為井底之蛙。
- 最後一個也是比較重要的——滿足我的虛榮心(大家不要吝嗇,多給我點小星星。哈哈,我就是這麼不要臉!不要臉!要臉!臉!)
2.新版本i博客園App效果
之前版本的i博客園請移步《博客園第三方客戶端-i博客園正式發佈App Store》。因為換了新的Web API,所以增加了很多新功能,比如文庫、登錄等等。
博客 | 新聞 | 文庫 |
我-登錄 | 我-非登錄 | |
3. i博客園代碼結構簡介
3.1 代碼整體結構
整體代碼是按功能模塊來劃分的,而每個功能模塊是按MVC來的(下麵會介紹)。這裡我一共分為7個模塊:1.博客(Blog) 2.新聞(News) 3.文庫(知識庫Library) 4.快閃記憶體(暫時未實現,Flash) 5.我(Me) 6.引導頁(Guide) 7.主要(Main)
3.2 各模塊介紹
3.2.1 博客
博客的內容主要包括兩部分,一個是首頁,另一個精選。
首頁部分使用的是簡單的tableView,每個cell的類型就是放在BlogHomeTableViewCell目錄下的ICBlogHomeTableViewCell。其中動態計算cell高度是使用了UITableView+FDTemplateLayoutCell這個庫。精選部分使用了自定義collectionViewLayout,名叫ICBlogPickedCollectionViewLayout。另外,這兩個部分放在了一個scrollView(ICBlogScrollView)中。
首頁 | 精選 |
至於每個Blog的內容呈現,我使用的是KINWebBrowser庫,而非使用從伺服器端獲取的JSON數據來解析,因為JSON解析的效果很差,還不如直接用Web瀏覽器顯示好看。使用KINWebBrowser時,你只需雙擊頁面,即可放大到最佳閱讀模式,使用UIWebView無法做到這一點。
3.2.2 新聞
新聞的內容主要包括三個部分:最新(ICNewsNewestTableView)、推薦(ICNewsRecommendTableView)、熱門(ICNewsHotTableView)。
三者都使用了tableView,放在一個scrollView(ICNewsScrollView)中。每個tableViewCell都是ICNewsTableViewCell類型。個人比較喜歡簡潔風格。
不過新聞的內容顯示,我是自己解析JSON數據進行排版的。自定義了一個ContentHTMLTemplateWithArgs的巨集函數來構建HTML數據。
3.2.3 文庫
基本同新聞,不過tableViewCell使用的是ICLibraryTableViewCell。
3.2.4 快閃記憶體(暫時未實現)
這一塊後面會重點做一下,因為這是用戶交流比較重度的一部分。
3.2.5.我
這一塊做的比較久,UI相對來說比較複雜,另外也涉及到OAuth的知識。OAuth部分推薦dudu的OAuth系列博客。
Me這一塊其實是由兩個兩部分組成,一個是登錄部分,一個是個人中心部分。
**登錄部分**
1.獲取用戶名和密碼
2.將用戶名和密碼使用openssl進行rsa加密
3.再利用grant_type為password的OAuth認證方式來登錄。
**個人中心**
我的博客和我的收藏都很簡單,就是簡單的tableView,連cell都沒自定義。
設置部分功能就比較雜:
①清除緩存使用的是SDWebImage,非同步清除,代碼如下:
ICLog(@"size count : %ld",[[SDImageCache sharedImageCache] getSize]); dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ [[SDImageCache sharedImageCache] clearDiskOnCompletion:^{ ICLog(@"清除成功"); ICLog(@"size count : %ld",[[SDImageCache sharedImageCache] getSize]); cell.textLabel.text = [self getCacheSize]; }]; });
②關於部分是使用了CNPPopupController,之所以這個簡單的功能也使用第三方庫,是因為我還沒想好怎麼做這種彈窗後背景模糊的效果,後面會更換成自己的庫。
③評價就很簡單了,不贅述了。
④退出賬號其實就是刪除了本地存儲的賬號信息文件。
3.2.6 引導頁
請參考我之前的博客《博客園第三方客戶端-i博客園正式發佈App Store》,此處就不贅述了。
3.2.7 主要(Main)
這部分內容很多,所以我分開來說,至於這裡Helper和Tool有什麼區別,大家請無視,本人經驗尚淺,還回答不了。
3.2.7.1 Vender
存放的是openssl的rsa加密的演算法。具體可以參見博客《RSA加密》。
3.2.7.2 Category
這個存放的東西就比較多了。我一直很認同田偉宇的一句話,category是典型的化繼承為組合的方法。而且這裡我儘量不會把強業務放在category中,我覺得category應該放一些弱業務的東西。
3.2.7.3 Helper
將dataSource從ViewController中分離,做到light View Controller。參考文章《更輕量的 View Controllers》。
3.2.7.4 Tool
**ICControllerTool**
主要是解決第一次安裝,或者更新App後,應該先啟動引導界面的問題。
**ICNetworkTool**
在AFNetworking上面分裝了一層,不過此處我覺得設計的不是很好。暫時先這樣,後面嘗試下離散型API調用。
**ICOAuthTool/ICClientCredentialsOAuthTool**
因為網路請求的時候會用到各種access_token,比如grant_type為client credentials和grant_type為password/refresh_token的access token就不一樣。
因此我定義了這兩個Tool來管理相對的請求。對應的Model就是ICOAuth和ICClientCredentialsOAuth。
3.2.7.5 Controller
**ICLeftMenuViewController/ICLeftSideMenu**
因為使用了RESideMenu,所以ICLeftSideMenu其實就是RESideMenu的子類,而ICLeftMenuViewController其實就是RESideMenu的LeftMenuViewController。
3.2.7.6 Other
放AppDelegate和main。
3.2.7.7 View
ICLeftMenuHeaderView其實就是ICLeftSideMenu上的這個:
4.開源的相關事項
4.1 開源地址
GitHub:https://github.com/polobymulberry/iCnblogs
4.2 開源後的工作
- 快閃記憶體部分
- 目前其他部分只能查看,還不能評論,刪除
- 搜索部分
- 分享功能
- refresh token不起作用
- 還有很多,想到了我就加到GitHub頁面上……
4.3 開源註意事項
因為有些地方涉及到隱私,所以我會將代碼進行脫敏(ClientID和ClientSecret)。大家下載以後不一定能直接運行。如果你感興趣的話,可以去博客園申請一個ClientID和ClientSecret。
5. 感謝
感謝博客園的管理員的幫助和指導。