新浪微博iOS版SDK“宝玉XP”框架学习笔记
本文為論壇會員3h2om分享,對新浪微博iOS版SDK-“寶玉XP”框架進行研究所寫的學習筆記,非常詳細和精彩。
本人剛入學iOS開發,在學習的過程中,對新浪微博iOS版SDK-“寶玉XP”框架進行了學習(下載地址:https://github.com/JimLiu/WeiboSDK),在沒有獲得相應的說明文檔前提下,要理解其中的內幕對于初涉OPEN API的新人來說不算是件易事,為了滿足一窺究竟的一慣心理,我在對其源代碼進行一番抽絲剝繭式的跟蹤后,基本上搞懂了框架內各類之間的調用關系,初略地理解了各類的大概用途,也對OAuth 認證機會有了進一步的認識。充分理解該框架后將對于開發基于HTTP協議的類似項目有一定的參考作用。現將我的這種“理解”簡要地進行整理,愿能對學習并想了解該SDK的人有所幫助。
一、組成和關系
該框架除了由大量的諸如數據連接、數據模型等基礎類支撐外,其主要的功能由 RootViewControllerComposeViewController、OAuthcontroller、OAuthEngine URLConnection、WeiboClient 6個類完成,RootViewController是整個框架的視圖控制器,它作為應用程序委托中的UINavigationController類型的輸出口,控制該系統的主視圖以呈現給用戶。ComposeViewController類是作為RootViewController類的組成部分存在的,用以控制寫微博時所呈現出的發送視圖。OAuthcontrller用以控制完成OAuth認證機制所需要的視圖。類OAuthEngine、URLConnection、WeiboClient為服務類,為各視圖控制類提供服務,類OAuthEngine為完成OAuth方式認證提供了支持,通過該方法完成授權和認證過程,URLConncetion和WeiboClient建立網絡連接,實現新浪提供的OPEN API功能,設置并完成HTTP請求以發送和接受數據。
二、各類簡單說明
1、RootViewController類
該類是整個系統的視圖控制類,是系統與外面交互的入口,也是系統的運行的驅動點,它關聯了OAuthEngine等服務類,在該類通過調用其他各服務類提供的功能,完成從用戶的登錄授權認證到把微博客。在viewDidLoad方法中,完成了對用于保存微博列表的NSMutableArray類的status的初如化。接著在viewDidAppear方法中,用服務方提供的三個URL和應用程序在新浪方獲取的Key和Secret完成其成員OAuthEngine類型的_engine的初始化工作,為OAuth認證提供了準備。在此之類,就調用自身loadTimeline方法,來完成包括OAuth認證、請求數據等一系列動作,從此,系統運行的萬里長征正式踏上征程。
2、ComposeViewController類
該類所控制的視圖是RootViewController類所控制的視圖的組成一部分,當用戶點擊主視圖上面導航欄中的發送按鈕,該類所控制的視圖將呈現出來,主要用于發送微博。Draft類描述發送微博時的附件信息,newTweet方法的主要作用是初始化draft,為發送新的微博上傳相關附件提供對應的對象,send方法用于調用的OPENG API完成發送這一動作,insert方法在發送微博時插入附件時被調用。
3、OAuthController類該類主要用于調用OAuthEngine類的服務來完成OAuth認證機制中的認證工作的三步認證,它由RootViewController類中的loodTimeline方法調用。該類中的_webView成員是用來顯示用戶授權界面的UIVebView控件,因此就實現了UIWebViewDelegate委托,用委托中相應的方法協調完成認證過程。該控件的URLRequest屬性被設置為三步認證中的第二個URL,用于獲取用戶授權的Request Token。
4、OAuthEngine類該類是OAuth認證實現的核心類,為其他類提供認證服務。調用requestRequestToken將獲取到經過授權的獲取用戶授權的Request Token,調用requestAccessToken將用授權的Request Token換取Access Token。
5、URLConnection和WeiboClient類WeiboClient是URLConnection的子類,WeiboClient實現了OPEN API方法,設置并完成HTTP請求以發送和接受數據,并用指定的action來處理通過的HTTP請求得到數據。
二、進入用戶授權界面的步驟
系統運行后,經過RootViewController類的viewDidApper事件方法,調用其lodadTimeline方法完成OAuth認證機制的第一步(獲取未授權的Request Token),之后進入到OAuthController類的loadView方法,該方法中通過語句:“*request = _engine.authorizeURLRequest; [_webView loadRequest: request];”完成認證機制中第二步,接著進入到webViewDidFinshg
事件方法,進入到授權界面。具體細節比較復雜,見下面的(進入授權界面的時序圖),由于沒有專門的UML工具,加之涉及到的對象較多,時序圖沒有列出所有的對象和細節。在進入RootViewController的viewDidAppear事件方法中,判斷該類中的_engine是否已經存在,如果沒有就對其初始化,接著調用“[self performSelector:@selector(loadTimeline) withObject:nil afterDelay:0.0]; ”進入到loadTimeline方法中。loadTimeline方法首先用本類中的實例成員_engine作為參數,著手構建OAuthController對象,下一步就判斷剛剛構建的動作是否真的構建了對象,如果對象存在,就立即轉入到剛剛構建OAuthController類對象所對應的視圖,即進入到授權界面,以供用戶進行授權。如果不存在OAuthController對象,就說明已經完成了認證,不用進入到授權界面,直接調用loadData加載與授權用戶相關的微博信息后,進入到RootViewController對應視圖即可。其中創建OAuthController對象是關鍵,在其中進行了判斷,如果已經授權了或者cache中還保存著相應的cooke的話,就退出,否則就用_engine為參數,調用OAuthController的初始化方法,初始化后又判斷_engine.OAuthSetup 的值,如果為NO則表示還沒有進行過認證(若為YES則表示已經完成了認證步中的第一步),于是就調用????_engine requestRequestToken來完成認證的第一步操作。OAuthEngine類中requestRequestToken方法的調用過程:該方法是一中間方法,起到過渡作用,它只是調用 requestURL: token:onSuccess: onFai:方法,后一個方法用指定的URL和兩個方法SEL作為參數,其中兩個SEL分別用于當該HTTP請求成功或失敗返回時對應的處理方法。它分別指定為setRequestToken和outhTicketFailed方法。
OAuthEngine類中的requestURL:token:onSuccess:onFail方法又用給定的URL和token構建了OAMutableURLRequest對象,然后構建OADataFetcher對象,并把它來提取基于OAMutableURLRequest網絡連接的數據(調用onSucess:和onFail方法)。如果成功,就調用上面傳過來的OAuthEngine類中setRequestToken方法處理認證第一步的返回數據。setRequestToken只是用得到的數據填充用OAuthEngine類中的_requestToken。
至此,已經完成了構建OAuthController對象,并工作完成了OAuth認證中的第一步了。接著,程序一路回退,回退至loadTimeline
方法中:
UIViewController *controller = [OAuthController controllerToEnterCredentialsWithEngine: _engine delegate:self]//通過以上的過程,該句已經執行完畢
if(controller)//第一次進入時總需要認證,總會構建controller,所以為為真值
[self presentModalViewContrllor: controller animated:YES];//
else
[self loadData];由于presentModalViewContrllor是異步方法,調用后,loadTimeline就當即結束了。經過幾番系統 的“原子操作后”,進入到OAuthController類中的loadView 事件方法中,在該事件方法中,將完成OAuth認證機制中的第二步過程。該方法對即將出現的授權界面中的一些UI進行了初始化設置后,調用:
NSURLRequest *request = _engine.authorizeURLRequest;
[_webView loadRequest:request];
在OAuthEngine類的authorizeURLRequest方法中,首先判斷_requestToke.key是否為空(由于我在第一步的認證過程上,已經設置好了),若不為空,則用authorizeURL和_requestToken等為參數,構建OAMutableURLRequest對象,并基于此設置好相關的HTTP請求,并返回供_webView加載,loadView結束后再進入_webViewDidFinishLoad事件方法。
至此,授權界面已經出現,以供用戶對其授權,界面如下:
此過程的詳細調用情況見下圖:
接上:進入授權界面的時序圖
三、用戶授權后并進入到微博主界面的調用關系
當用戶在授權界面上填寫好帳號和密碼后,點擊“授權”后,觸發OAuthController類的webViewStartLoadWithRequest事件和webViewDidFinishLoad方法,在webViewDidFinishLoad中調用gotPin方法得到Access Token完成OAuth認證機制的最后一步。之后RootViewController類中的viewDidAppear事件方法被觸發,在該方法中,調用loadData方法,完成數據的加載工作,然后就顯示了微博的主列表界面。
具體細節比較復雜,見下面的(進入授權界面的時序圖),由于沒有專門的UML工具,加之涉及到的對象較多,時序圖沒有列出所有的對象和細節。該時序圖僅描述用戶授權過程(即OAuth認證的最后步),沒有描述認證后其中加載數據的詳細過程,詳細過程見方法調用圖。
幾個重要方法:
RootViewController類中loadTimeline方法:該方法是本框架中的一個主要中轉方法,此方法調用OAuthController類的controllerToEnterCredentialsWithEng
ine完成認證中的前兩步操作,調用loadData方法完成認證的第三步和加載數據過程。
OAuthEngine類中的requestRequestToken方法用來完成認證第步的請求,setRequestToken方法用來處理接收數據,并設置好_requestToken;requestAccessToken方法用來完成認證第三步,setAccessToken方法用來處理上步接收的數據,并設置_accessToken
從而完成整個認證操作。OAuthController類中的locateAuthPinInW
ebView方法用來從返回的HTTP請求中獲取PIN碼,即獲取用授權的Request Token,完成認證的第二步,用此來作為第三步的參數。
RootViewController類中的timelineDidReceiveForComment方法用來處理接收從HTTP請求返回中的數據,在此方法中實現微博的數據的反序列化工作。
四、幾點發現
1、OAuthController類中的webViewDiFinishLoad事件方法中通過調用: _delegate OAuthController:self authenticatiedWit
ntroller:authenticatedWithUserName:_engine.username 方法間接地又調用了一次loadTimeline和loadData 方法生成WeiboCleint
對象并進行認證和加載數據操作,但由于WeiboClient對象是自動銷毀后,程序立即進入到了RootViewController類的viewDidApper事件方法,在這個方法中又調用loadTimeline,以至于上面的操作是多余的,等于在進行了兩次認證(第二步和第三步)和加載數據操作。
2.關于OAuthController類中的webView:shouldStartLoadWit
hRequest事件方法(視圖類的相關事件方法也一樣)連續被調用多次問題。這是一個很有趣的問題,至今我沒有發現什么原因。比如說要轉到(presentModalViewController:)一個視圖(該視圖實現了UIWebViewDelegate委托),該視圖控制器中實現了viewDidLoad和loadView事件方法,如果在這些方法中沒有調用其父類的對應方法,則被轉到的視圖控制器中的這兩個方法會連接地被調用,我一次試驗是連續地被調用了11次?但如果加上 super viewDidLoad 的話只正常地被調用1次。至于是什么原因,我至今未懂。?
原帖地址:http://www.cocoachina.com/bbs/read.php?tid-73476.html
總結
以上是生活随笔為你收集整理的新浪微博iOS版SDK“宝玉XP”框架学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到吃黄豆芽菜是什么意思
- 下一篇: 梦到别人牙齿掉了是什么意思