本文轉載請註明出處 —— polobymulberry-博客園html
目前i博客園App已經更新到2.0.0版本了,使用了最新的博客園Web API。相比於第一個版本,添加了不少新的功能,也修改了不少功能。總體來講改動比較大,代碼也比較混亂。因此趁着清明假期,把代碼好好整理了一番。目前基本的架構已成型(固然,後期還須要不斷優化),但App基本功能方面還有不少須要添加的,後面會集中把App功能完善。git
上面簡單介紹了下目前App的狀況,回到開源的話題來。開源這個App源碼實際上是我從一開始就有的願景,不過當初代碼很混亂,因此一直拖啊拖,中間也有不少實驗室的事情,不過我一直也沒放棄過要開源的這個想法。開源對我來講利大於弊的:github
以前版本的i博客園請移步《博客園第三方客戶端-i博客園正式發佈App Store》。由於換了新的Web API,因此增長了不少新功能,好比文庫、登陸等等。算法
博客 | 新聞 | 文庫 |
![]() |
![]() |
![]() |
我-登陸 | 我-非登陸 | |
![]() |
![]() |
總體代碼是按功能模塊來劃分的,而每一個功能模塊是按MVC來的(下面會介紹)。這裏我一共分爲7個模塊:1.博客(Blog) 2.新聞(News) 3.文庫(知識庫Library) 4.閃存(暫時未實現,Flash) 5.我(Me) 6.引導頁(Guide) 7.主要(Main)瀏覽器
博客的內容主要包括兩部分,一個是首頁,另外一個精選。緩存
首頁部分使用的是簡單的tableView,每一個cell的類型就是放在BlogHomeTableViewCell目錄下的ICBlogHomeTableViewCell。其中動態計算cell高度是使用了UITableView+FDTemplateLayoutCell這個庫。精選部分使用了自定義collectionViewLayout,名叫ICBlogPickedCollectionViewLayout。另外,這兩個部分放在了一個scrollView(ICBlogScrollView)中。服務器
首頁 | 精選 |
![]() |
![]() |
至於每一個Blog的內容呈現,我使用的是KINWebBrowser庫,而非使用從服務器端獲取的JSON數據來解析,由於JSON解析的效果不好,還不如直接用Web瀏覽器顯示好看。使用KINWebBrowser時,你只需雙擊頁面,便可放大到最佳閱讀模式,使用UIWebView沒法作到這一點。網絡
新聞的內容主要包括三個部分:最新(ICNewsNewestTableView)、推薦(ICNewsRecommendTableView)、熱門(ICNewsHotTableView)。架構
三者都使用了tableView,放在一個scrollView(ICNewsScrollView)中。每一個tableViewCell都是ICNewsTableViewCell類型。我的比較喜歡簡潔風格。異步
不過新聞的內容顯示,我是本身解析JSON數據進行排版的。自定義了一個ContentHTMLTemplateWithArgs的宏函數來構建HTML數據。
基本同新聞,不過tableViewCell使用的是ICLibraryTableViewCell。
這一塊後面會重點作一下,由於這是用戶交流比較重度的一部分。
這一塊作的比較久,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,之因此這個簡單的功能也使用第三方庫,是由於我還沒想好怎麼作這種彈窗後背景模糊的效果,後面會更換成本身的庫。
③評價就很簡單了,不贅述了。
④退出帳號其實就是刪除了本地存儲的帳號信息文件。
請參考我以前的博客《博客園第三方客戶端-i博客園正式發佈App Store》,此處就不贅述了。
這部份內容不少,因此我分開來講,至於這裏Helper和Tool有什麼區別,你們請無視,本人經驗尚淺,還回答不了。
存放的是openssl的rsa加密的算法。具體能夠參見博客《RSA加密》。
這個存放的東西就比較多了。我一直很認同田偉宇的一句話,category是典型的化繼承爲組合的方法。並且這裏我儘可能不會把強業務放在category中,我以爲category應該放一些弱業務的東西。
將dataSource從ViewController中分離,作到light View Controller。參考文章《更輕量的 View Controllers》。
**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。
放AppDelegate和main。
ICLeftMenuHeaderView其實就是ICLeftSideMenu上的這個:
GitHub:https://github.com/polobymulberry/iCnblogs
由於有些地方涉及到隱私,因此我會將代碼進行脫敏(ClientID和ClientSecret)。你們下載之後不必定能直接運行。若是你感興趣的話,能夠去博客園申請一個ClientID和ClientSecret。
感謝博客園的管理員的幫助和指導。