Facebook

Facebook登陸爲iOS

Facebook的SDK爲iOS提供了各類登陸的經驗,你的應用程序可使用它來 ​​驗證一我的。這份文件包括了全部你須要知道,以落實Facebook登陸在你的iOS應用程序的信息。若是您想了解更多關於Facebook登陸通常而言,爲何你可能想使用它,你能夠在咱們這樣作的登陸門戶php

有兩種方式能夠實現Facebook登陸在你的iOS應用方法:使用Facebook的登陸按鈕,或者實現你使用API調用自定義登陸界面咱們將介紹這兩個步驟一步的教程,包括示例代碼和示例應用程序,您能夠從Github上下載。這些教程將幫助您的登陸執行實際的一面。若是你想得到Facebook的會議是如何工做的一個更深刻的瞭解,咱們將介紹在一個單獨的部分ios

其中一個讓人們使用Facebook的登陸到您的應用程序的好處是,他們能夠將權限授予您的應用程序使您能夠檢索信息或代其執行在Facebook的行動。該文件還提供了關於如何的信息管理權限綁在Facebook的會話。git

Facebook的會話和權限存儲在訪問令牌,它會自動經過Facebook的SDK以便他們可當登陸的用戶返回到您的應用程序緩存。可是,若是你想這樣作,咱們將解釋如何作到這一點,您能夠管理本身的令牌緩存在這裏github

使用登陸按鈕

在本節中:api


概觀

Facebook的SDK爲iOS提供了能夠用來登陸的人在你的應用程序的進出預構建UI組件。爲了驗證用戶,這些控件撥打電話到用戶的Facebook應用程式或將回落到使用網頁對話框,若是用戶沒有安裝一個Facebook應用程序。

FBLoginView是在Facebook的SDK,能夠處理大量的幫助用戶登陸和註銷複雜的控件。它顯示一個用戶界面按鈕意識到人的登陸狀態,並會自動顯示相應的提示信息,「登陸」或「退出」,這取決於使用它的人是否被認證與否,就像這樣:

當人們點擊註銷按鈕,它們被顯示的動做片,讓他們確認,他們想退出:

本教程介紹瞭如何使用Facebook的使用FBLoginView UI控件實現登陸。此處顯示的示例代碼屬於FBLoginUIControlSample應用程序。若是你想看到此示例的完整代碼,你能夠找到它github.com / fbsamples / IOS-HOWTO文檔然而,本教程是自包含的,你不須要檢查出的應用程序代碼,以便可以遵循它。

注意:若是您正在實施的Facebook登陸在你的應用程序,你可能要檢查是否有從之前的會話遺留下來的有效的訪問令牌和他們無需觸碰登陸按鈕會自動驗證用戶的身份。要了解更多關於如何記錄你的用戶在使用緩存的令牌做品您能夠訪問咱們的理解會話嚮導。要找到一個示例實現,與代碼,您能夠參考咱們的自定義UI登陸教程


先決條件

在開始以前本教程中,您將須要:

  • 您的環境設置
  • 正確配置並鏈接到你的iOS應用,Facebook的應用程序與單點登陸啓用
  • Facebook的SDK添加到項目中
  • 您的Facebook應用程序ID和顯示名稱添加你的應用程序的。plist文件

若是你尚未這樣作,須要幫助這樣作,你能夠按照咱們的入門指南


添加登陸的UI控件

你能夠經過編程方式或圖形添加登陸按鈕。

以編程

首先,Facebook的適用於iOS的SDK頭文件添加到您的控制器代碼:

#進口<FacebookSDK/FacebookSDK.h>

而後,你能夠建立一個登陸按鈕中的任何視圖控制器用下面的代碼:

FBLoginView  * 的LoginView =  [[ FBLoginView 的alloc ] 初始化]  [ 自我視圖addSubview 登陸視圖];

只要你喜歡你能夠定位和大小的按鈕。例如,下面的代碼對準在中心水平的按鈕:

FBLoginView  * 的LoginView =  [[ FBLoginView 的alloc ] 初始化]  / /對齊按鈕,在中心       addSubview 登陸視圖];

圖形

您能夠添加圖形採用了iOS界面生成器的登陸UI控件。要添加的UI控件,請執行如下操做:

  1. 添加一個視圖對象來佈局。如你願意,你能夠調整其大小。
  2. 在身份檢查,改變類屬性來FBLoginView

更改後,你的佈局應該相似這樣:

注:在Facebook的SDK 3.7.x及更早的版本中,登陸UI控件不支持使用自動佈局約束。你將須要定義其佈局的老辦法,經過設置大小督察的自動尺寸調整掩碼中的彈簧和支柱。

設置您的佈局後,進行如下更改到的調用時,您的應用程序啓動代碼。這些變化請確保FBLoginView類被加載的視圖顯示以前:

-  BOOL 應用:(的UIApplication  *)的應用 didFinishLaunchingWithOptions :(NSDictionary中 *)launchOptions {  。後啓動應用程序/ /覆蓋點進行定製 [ FBLoginView  ]  ...  返回YES ;  }

注意:若是你已經添加了-ObjC的標誌,你的連接器選項,那麼你就沒必要添加此代碼。並稱,標誌會致使連接器加載在Facebook的SDK中全部的目標文件,包括FBLoginView類。若是你想知道更多關於什麼的,ObjC的標誌呢,你能夠看看咱們的故障排除指南


從Facebook的應用程序處理的響應

處理您從與Facebook登陸過程的互動獲得響應,你須要重寫應用程序:的OpenURL:sourceApplication:註釋:方法在你的應用程序委託中加入如下代碼:

 -  BOOL 應用:(的UIApplication  *)的應用 的OpenURL :(NSURL *)網址 sourceApplication :(的NSString  *)sourceApplication 註釋:(ID 註釋{ / /調用FBAppCall的handleOpenURL:sourceApplication處理Facebook應用程序的響應 BOOL wasHandled =  [ FBAppCall handleOpenURL 網址sourceApplication sourceApplication ]; / /若是須要,能夠在這裏添加你的應用程序特定的URL處理代碼 返回wasHandled ;  }

要求權限

當有人使用Facebook登陸的應用程序進行鏈接時,應用程序能夠訪問任意要求讀取數據的那我的可能已經加入到Facebook的一個子集。例如,包含在他們的信息的公衆形象是可用的背後public_profile許可。一樣,全部其餘部分的信息,有人增長了他們的Facebook的我的資料做抵押落後於其餘的讀取權限。例如,一我的的主電子郵件地址是經過訪問電子郵件的權限。

除了 ​​讀取數據,應用程序還須要獨立的,以發佈內容表明我的的發佈權限。這些都是分開的,讓你讀一我的的信息的讀取權限。人們經常對授予發佈權限很是敏感的,因此你應該只要求對發佈權限,一旦一我的已經準備好從發佈你的應用程序和一些不能在初始登陸過程。登陸控制使得這個容易被分離的讀取權限和發佈權限。若是您想了解更多有關權限,你能夠看看咱們的權限一節

下面是要求一個例子電子郵件public_profileuser_friends讀取權限。若是您正在建立的控制編程這是有用的:

FBLoginView  * loginView =  [[ FBLoginView alloc ] initWithReadPermissions :  @[@ "public_profile" ,  @ "email" ,  @ "user_friends" ]];

另外,若是您使用的是FBLoginView經過界面生成器能夠經過設置讀取權限readPermissions的物業FBLoginView實例:

/ /在你看來頭文件: @財產 非原子 IBOutlet  FBLoginView  * 的LoginView ; / /在你的viewDidLoad方法: 自我的LoginView readPermissions =  @ [@ 「public_profile」  @ 「電子郵件」  @ 「user_friends」 ];

權限審查

若是你的應用要求超過public_profile電子郵件user_friends,那麼它將不得不經過Facebook的審查能夠提供給廣大市民面前。請參閱咱們的評論文檔獲取更多信息。


處理身份驗證回調

FBLoginView保持認證狀態。這意味着,該按鈕會顯示相應的標籤並進行登陸或註銷時,它的挖掘。的另外一個特色FBLoginView是它獲取的公衆形象時,登陸的公衆形象取人登陸後的典型要求的應用程序提出的,UI控件會自動執行此操做。

您能夠對影響的事件接收通知FBLoginView由符合FBLoginViewDelegate協議並實施某些方法。那麼你的表明將得到如下事件的通知:

  • FBLoginView已提取的公衆形象。若是你實現了你的應用程序被通知loginViewFetchedUserInfo:用戶:委託方法。
  • 任何人登陸,若是你實現你的應用程序是通知loginViewShowingLoggedInUser:方法。
  • 一我的被註銷。若是你實現了你的應用程序被通知loginViewShowingLoggedOutUser:委託方法。
  • 發生通訊或受權錯誤。您的應用程序被通知,若是你執行的LoginView:handleError的:委託方法。

爲了向你展現如何將這些回調的工做,咱們已經建立了一個例子,其中包含三個視圖控制器網點:一種用於顯示人的我的資料圖片時,該人已登陸,第二個要顯示本身的名字時,他們在已經登陸,而第三個顯示狀態(「你的身份登陸」或「你沒有登陸!」)。咱們的應用程序的UI看起來像這樣:

而咱們的界面看起來像這樣:

@interface  LoginUIViewController  ()  @property  ( strong , nonatomic )  IBOutlet  FBProfilePictureView  * profilePictureView ;  @property  ( strong , nonatomic )  IBOutlet  UILabel  * nameLabel ;  @property  ( strong , nonatomic )  IBOutlet  UILabel  * statusLabel ;  @end

注意:若是你想看到這些例子的完整代碼,或查看運行中的登陸控件,您能夠從檢出FBLoginUIControlSample應用程序github.com / fbsamples / IOS-HOWTO文檔。然而,本教程是自包含的,你不須要檢查出的應用程序代碼,以便可以遵循它。

要設置委託方法,首先添加FBLoginViewDelegate你的類的協議列表。

@接口 LoginUIViewController   的UIViewController  < FBLoginViewDelegate >

接着,分配委託給你的視圖控制器類。

若是以編程方式定義的登陸UI控件,修改代碼以執行如下操做:

FBLoginView  * 的LoginView =  [[ FBLoginView 的alloc ] 初始化];  LoginView控件委託 =  自我;  ...

若是你定義使用Interface Builder的登陸UI控件:

  • 選擇視圖表示登陸按鈕。
  • 在鏈接檢查器中,鏈接委託 出口到文件的全部者。

而後,執行可選的委託方法。

實施loginViewFetchedUserInfo:用戶:委託方法可讓您我的觸摸到你的應用程序。在這個例子中,在返回的用戶數據​​FBGraphUser對象是用來設置用戶的配置文件圖像,並設置其名稱:

/ /這個方法會被調用,當用戶信息被取出 -  無效loginViewFetchedUserInfo :(FBLoginView  *)的LoginView 用戶:(ID < FBGraphUser >)用戶{  自我profilePictureView 配置文件ID = 用戶標識;  自我nameLabel 文字= 用戶;  }

實施loginViewShowingLoggedInUser:委託方法容許您修改您的應用程序的UI來顯示記錄中的經驗。在下面的例子中,咱們通知他們改變狀態登陸的用戶:

/ /登陸的用戶體驗 -  無效loginViewShowingLoggedInUser :(FBLoginView  *)的LoginView {  自我statusLabel 文字=  @ 「你的記錄爲」 ;  }

實施loginViewShowingLoggedOutUser:委託方法容許您修改您的應用程序的UI來顯示記錄的實踐經驗。在下面的例子中,用戶的我的資料圖片被刪除,用戶的名稱設置爲空白,且狀態被改變,以反映不登陸的用戶:

/ /登出用戶          沒有登陸!「 ;  }

最後,實施的LoginView:handleError的:委託方法能夠檢測並優雅地應對錯誤。請參見API文檔的錯誤就可能驗證錯誤,並建議恢復策略的更多細節。

在這個例子中,使用您的應用程序的人被告知,若是:*他們須要你的應用程序以外執行一個動做,從錯誤中恢復(例如,若是登陸嘗試失敗,由於用戶的Facebook密碼已更改,或他們的Facebook賬戶未驗證)*會話再也不有效(例如是用戶從Facebook的用戶界面退出你的應用程序)*對於任何其餘錯誤,但若是用戶拒絕您的應用程序所要求的權限

/ /處理可能發生在登陸過程當中可能出現的錯誤 -  無效的LoginView :(FBLoginView  *)的LoginView handleError的:(NSError  *)錯誤{  的NSString  * alertMessage  * alertTitle ; / /若是用戶要的你以外執行操做的應用程序恢復, / / SDK將提供給用戶一個信息,你只須要浮出水面了。 / /這個方便地處理像Facebook密碼變動或未經覈實的Facebook帳戶的狀況。 若是 ([ FBErrorUtility shouldNotifyUserForError 錯誤]) {  alertTitle =  @ 「Facebook的錯誤」 ;  alertMessage =  [ FBErrorUtility userMessageForError 錯誤]; / /此代碼將處理髮生在應用程序以外會話關閉 / /你能夠看看咱們的錯誤處理指南,多瞭解          錯誤「 ;  alertMessage =  @ 「你的當前會話再也不有效。請從新登陸「。; / /若是用戶已經取消了登陸,咱們不會作任何事情。 / /你也能夠選擇向用戶顯示一條消息,若是取消登陸將致使 / /用戶不可以完成任務,他們已經在你的應用程序啓動 / /(如訪問FB-存儲的信息或張貼到         註銷登陸「 ); / /爲了簡單起見,此示例處理與一個通用的消息其餘錯誤 / /能夠檢出咱們的錯誤處理指南更詳細的信息 / / https://developers.facebook.com/docs/ios/errors  }  不然 {  alertTitle =  @ 「出事了」 ;  alertMessage =  @ 「請稍後再試。」 ;  的NSLog (@ 「意外的錯誤:%@」 錯誤);  } 若是 alertMessage  {  [[[ UIAlertView 的alloc ] initWithTitle alertTitle 消息alertMessage 表明 cancelButtonTitle :@ 「肯定」  otherButtonTitles ] ];  }  }

測試您的登陸流程

按照咱們的測試您的登陸流程指南,以確保您的應用程序的登陸將在一系列共同的條件下工做。


其餘資源

有關添加登陸到您的iOS應用程序的更多信息,請參見如下內容:

打造您本身的按鈕

在本節中:


概觀

本教程將引導您如何使用本身的自定義用戶界面的登陸和註銷的控件添加Facebook登陸到您的應用程序。經過這種方式,你能夠留在你的應用程序的外觀和感受的控制,並提供一致的用戶體驗。

要實現這一點的登陸,咱們將使用Facebook的SDK的核心對象之一:FBSession。該FBSession對象用於驗證用戶和管理用戶的會話。打開會話將啓動認證流程以後,一個有效的用戶會話應提供並隨後緩存在一個訪問令牌的形式。緩存的訪問令牌,當仍然有效,能夠被用來從新打開一個會話的任什麼時候間。關閉會話註銷用戶,並能夠選擇性地清除緩存的令牌。當一個應用程序能夠建立FBSession的實例,並管理它們自己,FBSession提供傭工,以簡化具備單一登陸的人一個應用程序的常見的場景。咱們將在這裏使用這些傭工。若是您想了解更多關於Facebook的會議是如何工做的,你能夠閱讀咱們的理解會話部分

本教程介紹了一個簡單的用例,用戶會看到一個自定義的登陸/註銷按鈕,用戶能夠觸摸來切換他們的身份驗證狀態。當用戶登陸時,咱們將向而後登陸的用戶界面,它包含一個歡迎信息和改變按鈕的標題爲「退出」,當用戶註銷後,咱們會向他們展現一個註銷確認消息和一個「經過Facebook登錄「按鈕,以下所示:

咱們也會檢查是否有緩存的會話,當用戶打開該應用程序,以便自動登陸,若是可能的用戶。所示的示例代碼屬於FBLoginCustomUISample應用程序。若是你想看到此示例的完整代碼,你能夠找到它github.com / fbsamples / IOS-HOWTO文檔。然而,本教程是自包含的,你不須要檢查出的應用程序代碼,以便可以遵循它。


先決條件

在開始以前本教程中,您將須要:

  • 您的環境設置
  • 正確配置並鏈接到你的iOS應用,Facebook的應用程序與單點登陸啓用
  • Facebook的SDK添加到項目中
  • 您的Facebook應用程序ID和顯示名稱添加你的應用程序的。plist文件

若是你尚未這樣作,須要幫助這樣作,你能夠按照咱們的入門指南


打開會話

當用戶使用Facebook賬號登陸到您的應用程序,你的應用程序將控制權交給了Facebook的iOS應用程序或Facebook在移動瀏覽器,它會顯示用戶一個對話框,提示他們受權您的應用程序。若是一切順利,這將致使建立將存儲在一個訪問令牌和緩存的會話。可是,當你試圖讓你的用戶登陸到你的應用程序,不管是與Facebook或其餘方式,它始終是很好的作法,避免沒必要要的步驟,以儘可能減小摩擦。因此,若是一我的曾登陸到Facebook上與你的應用程序,並仍然有從該會話的有效緩存的道理,咱們建議您使用它打開一個會話。這樣,你無需爲你的用戶在觸摸一個按鈕來登陸。

要實現這一點,在應用程序委託的應用:didFinishLaunchingWithOptions:方法,咱們將添加如下內容:

/ /當一我的打開的應用程序,檢查是否有緩存的會話 ,若是 FBSession activeSession 狀態==  FBSessionStateCreatedTokenLoaded  { / /若是有一個,剛打開會話默默地,而不顯示用戶的登陸界面 [ FBSession openActiveSessionWithReadPermissions :@ [@ 「public_profile」 ]  allowLoginUI 無 completionHandler :^(FBSession  * 會話 FBSessionState 狀態 NSError  * 錯誤 {  / /處理程序的會話狀態改變 / /這個方法會被調用每次會話狀態的變化, / /也爲中間狀態,而不只僅是在會議開幕 [ 自我sessionStateChanged 會話狀態狀態錯誤錯誤]  }];

咱們首先檢查是否有經過檢查活動會話的狀態的緩存令牌。若是有一個緩存的令牌的會話狀態將被FBSessionStateCreatedTokenLoaded。若是是這樣的話,咱們能夠嘗試使用打開緩存的會話FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:方法與allowLoginUI:設置爲NO(這將防止在登陸對話框中的顯示)。須要傳遞給此方法的其餘參數爲:

  • 權限你的要求。
  • 完成處理程序,它會被調用,每當有一個會話狀態的變化。

當有人使用Facebook登陸的應用程序的鏈接,應用程序能夠訪問他們保存在Facebook數據。這是經過要求作的權限。讀取數據須要要求的讀取權限。應用程序還須要以發佈內容的用戶的名義發佈權限。若是您想了解更多有關權限,你能夠看看咱們的權限一節

這要求更多了應用程序public_profile電子郵件user_friends將不得不經過Facebook的審查能夠提供給廣大市民才。請參閱咱們的評論文檔獲取更多信息。

openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:接受一個將被調用,每當有一個會話狀態更改處理。這意味着,你的處理方法會被調用每個登陸過程當中的中間階段狀態的變化,不只在會話打開(或打開失敗)。同時也爲發生其餘全部會話狀態改變會話的整個生命週期中。若是您想了解更多關於FBSession生命週期,您能夠參考咱們的理解會話嚮導。咱們將仔細看看這個在處理會話狀態的變化部分本教程。

到目前爲止,咱們已經討論瞭如何打開一個會話,若是有一個緩存的令牌。打開一個會話,而無需一個是很是類似的。在咱們的例子中,咱們有一個按鈕,用戶能夠觸摸切換認證。當用戶觸摸這個按鈕,應用程序將控制傳遞給Facebook的iOS應用或Facebook在移動瀏覽器,它會顯示用戶一個對話框,提示他們受權的應用程序,像這樣:

要實現這一點,咱們須要作三件事情:

  • 會話打開/關閉呼叫添加到登陸按鈕
  • 處理傳入的URL,當Facebook的應用程序或Facebook網站將控制返回給您的應用程序
  • 處理的狀況下,用戶離開正在顯示Facebook登陸對話框,而您的應用程序時,

要鏈接的按鈕,在按鈕的委託,咱們作到如下幾點:

-  IBAction buttonTouched :(ID 發件人 {  / /若是會話狀態是任意的兩個「開」狀態時,按鈕clicked  if  ( FBSession . activeSession . state ==  FBSessionStateOpen  ||  FBSession . activeSession . state ==  FBSessionStateOpenTokenExtended )  { / /關閉會話並從緩存中移除的訪問令牌 / /會話狀態處理程序(在應用程序委託)將被自動調用 [ FBSession activeSession closeAndClearTokenInformation ]; / /若是會話狀態不是任意的兩個「開」狀態的按鈕被點擊時 }  不然 {  / /打開一個會話顯示用戶的登陸界面 / /你必須始終打開一個會話時要求public_profile權限 [ FBSession openActiveSessionWithReadPermissions :@ [@ 「public_profile」 ]  allowLoginUI YES completionHandler  ^(FBSession  * 會話 FBSessionState 狀態 NSError  * 錯誤 { / /檢索應用程序委託 AppDelegate中* 的AppDelegate =  [ 的UIApplication sharedApplication ]。表明;  / /調用應用程序委託的sessionStateChanged:狀態:錯誤的方法來處理會話狀態的變化 [ AppDelegate中sessionStateChanged 會話狀態狀態錯誤錯誤]  }];  }  }

當用戶觸摸該按鈕時,若是當前會話是打開的,咱們將其關閉。另外,若是在當前會話中比開其餘任何國家,咱們將嘗試打開它。要檢查是否會話是開放的,咱們檢查會話狀態是任何兩個打開的狀態:FBSessionStateOpenFBSessionStateOpenTokenExtended。若是是這樣的話,咱們經過調用關閉會話closeAndClearTokenInformation上的活動會話。會議閉幕會自動調用會話狀態更改處理。若是會話沒有打開,咱們將嘗試經過調用打開它FBSession openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:方法與allowLoginUI:設置爲YES。一樣,咱們須要指定權限(至少public_profile)和完成處理程序。對於完成處理程序,咱們使用的是咱們用於無聲登陸一樣的方法。

接着,以處理傳入的URL,當Facebook的應用程序或Facebook網站將控制返回給您的應用程序,重寫應用程序:的OpenURL:sourceApplication:標註在你的應用程序委託來調用處理傳入的URL FBsession對象:

/ /在Facebook登陸流程,您的應用程序將控制權交給了Facebook的iOS應用程序或Facebook在移動瀏覽器 。/ /驗證後,您的應用程序將被召回的會話信息 -  BOOL 應用:(的UIApplication  *)應用 的OpenURL :(NSURL *)網址 sourceApplication :(的NSString  *)sourceApplication 註釋:(ID 註釋 {  返回 [ FBAppCall handleOpenURL 網址sourceApplication sourceApplication ];  }

默認狀況下,FBAppCall將完成流FBSession.activeSession。若是你明確管理FBSession狀況下,請使用以過載FBSession實例。

最後,你將須要處理的狀況下,用戶離開正在顯示Facebook登陸對話框,而您的應用程序時。這可能發生,例如,若是使用壓iOS的「家」按鈕,對話框被激活。爲了處理這種狀況,覆蓋applicationDidBecomeActive:方法在你的應用程序委託調用FBAppCall handleDidBecomeActive。該方法將檢查可能已離開掛任何會議開幕進程,而且將清除懸而未決的會話,這樣就能夠從新開始。

-  無效applicationDidBecomeActive :(的UIApplication  *)應用 { / /處理用戶離開應用程序正在顯示Facebook登陸對話框時 / /例如:當用戶按下了iOS的「家」按鈕,登陸對話框被激活 [ FBAppCall handleDidBecomeActive ];  }

在接下來的會議上,咱們將看到如何處理會話狀態的變化。


處理會話狀態的變化

在以前的會議上,當咱們打開一個會話,咱們必須提供一個將被調用,每當有一個會話狀態更改處理。這種處理方法會被調用每個登陸過程當中的中間階段狀態的變化,不只在會話打開(或打開失敗)。同時也爲發生其餘全部會話狀態改變會話的整個生命週期中。若是您想了解更多關於FBSession生命週期,您能夠參考咱們的理解會話部分

這裏是處理程序,與不一樣的可能狀態的變化和錯誤處理的例子:

/ /此方法將處理應用程序的全部會話狀態的變化 -  無效sessionStateChanged :(FBSession  *)會話狀態:(FBSessionState 狀態錯誤:(NSError  *)錯誤 {  / /若是session被成功打開 ,若是 (!錯誤&& 狀態==  FBSessionStateOpen ){  的NSLog (@ 「會話打開」 );  / /顯示用戶已登陸          若是會話被關閉 的NSLog (@ 「關閉會話」 );  / /顯示用戶已登陸了的用戶界面 [ 自我userLoggedOut ];  } / /處理錯誤 ,若是 錯誤){  的NSLog (@ 「錯誤」 );  的NSString  * alertText ;  的NSString  * alertTitle ;  / /若是錯誤要求人們使用的應用程序,使應用程序以外的行動,以恢復 若是 ([ FBErrorUtility shouldNotifyUserForError 錯誤]  == YES ){  alertTitle =  @ 「出事了」 ;  alertText =  [ FBErrorUtility userMessageForError 錯誤]  [ 自我showMessage alertText withTitle alertTitle ];  }  不然 { / /若是用戶註銷登陸,什麼都不作 ,若是 ([ FBErrorUtility errorCategoryForError 錯誤]  ==  FBErrorCategoryUserCancelled  {  的NSLog (@ 「用戶註銷登陸」 ); 這種狀況發生的外/ /處理會話關閉        錯誤「 ;  alertText =  @ 「你的當前會話再也不有效。請從新登陸「。;  [ showMessage alertText withTitle alertTitle ]; / /在這裏,咱們將處理與通常錯誤消息的全部其餘錯誤。 / /咱們建議您查看咱們的處理錯誤引導有關詳細信息, / / https://developers.facebook.com/docs/ios/errors/  }  不然 {  / /從錯誤中獲取更多的錯誤信息 的NSDictionary  * errorInformation =  [[[ 錯誤USERINFO objectForKey :@ 「com.facebook.sdk:ParsedJSONResponseKey」 ] objectForKey :@ 「身體」 ] objectForKey :@ 「錯誤」 ]; / /顯示用戶的錯誤消息 alertTitle =  @ 「出事了」 ;  alertText =  [ NSString的stringWithFormat :@ 「請重試\ n \ n已若是問題仍然存在,請聯繫咱們,況且這個錯誤代碼:%@」  [ errorInformation objectForKey :@ 「消息」 ]]  [ showMessage alertText withTitle alertTitle ];  }  }  / /清除此令牌 [ FBSession activeSession closeAndClearTokenInformation ];  / /顯示用戶已登陸了的用戶界面 [ 自我userLoggedOut ];  }  }

在這種狀況下,若是會話成功打開後,咱們會向用戶顯示一個登陸的用戶界面。若是會話被關閉,要麼故意或者若是登陸失敗,咱們會顯示用戶已登陸了的用戶界面。

若是有任何錯誤,咱們會處理它們的方式以下。首先,咱們將調用FBErrorUtility shouldNotifyUserForError:方法傳遞給它,咱們獲得了錯誤,以找出是否錯誤要求人們使用你的應用程序,使一個動做你的應用程序以外,以恢復。這多是狀況下,例如,若是用戶尚未證明他們的Facebook賬戶,他們要完成這一過程,纔可使用此賬戶登陸到您的應用程序。在這種狀況下,該SDK提供並指示一個錯誤信息,你能夠顯示你的用戶。因此,若是shouldNotifyUserForError:返回,那麼咱們將經過展現它們,咱們從獲得的消息通知用戶FBErrorUtility經過調用錯誤:userMessageForError。若是沒有,咱們將不得不到應用程序的錯誤邏輯中處理錯誤。處理錯誤,咱們將須要更多的信息。此信息可在錯誤分類,檢索它,咱們能夠調用[FBErrorUtility errorCategoryForError:錯誤]

當用戶觸摸的狀況下,「取消」顯示Facebook登陸對話框時,錯誤類別將被FBErrorCategoryUserCancelled。在這個例子中,咱們選擇忽略這一點,但你也能夠選擇向用戶顯示一條消息,若是你以爲取消登陸會致使用戶不可以完成任務,他們已經在你的應用程序啓動(好比訪問FB存儲的信息或張貼到Facebook)。

咱們已經提到,這種處理方法會被調用爲每一個會話狀態改變會話的整個生命週期內,因此咱們還須要處理會話關閉,可你的應用程序以外發生的,即便他們是無關的登陸過程。這方面的一個例子是一個會話結束這種狀況發生,由於用戶從Facebook的用戶界面中刪除你的應用程序。對於這些狀況,錯誤類別將FBErrorCategoryAuthenticationReopenSession。爲了從錯誤中恢復,咱們告訴咱們的用戶從新登陸。

在這個例子中,咱們只專門處理兩個錯誤類別,爲剩下的一個通用的消息,可是你可能須要處理其餘案件具體取決於您的應用程序。你能夠找到在不一樣的錯誤類型,他們在咱們的意思是什麼的詳細信息FBError參考。您也能夠閱讀更多有關錯誤處理在咱們的錯誤處理指南

最後,若是出現了任何錯誤,咱們將清除緩存令牌經過調用closeAndClearTokenInformation上的活動會話,因此下一次咱們嘗試,咱們開始一個新的會話登陸。


處理應用程序冷啓動

因爲大多數的登陸流量須要一個應用程序切換來完成,這是可能你的應用程序可以由iOS的在內存不足的狀況(或者,若是您的應用程序不支持backgrounding)終止。在這種狀況下,提供給您的open調用的狀態變化處理程序塊丟失。要處理這種狀況下,您能夠明確指定狀態改變處理程序塊的FBSession實例以前任什麼時候間handleOpenURL:打電話。例如,

/ /在Facebook登陸流程,您的應用程序將控制權交給了Facebook的iOS應用程序或Facebook在移動瀏覽器 。/ /驗證後,您的應用程序將被召回的會話信息 -  BOOL 應用:(的UIApplication  *)應用 的OpenURL :(NSURL *)網址 sourceApplication :(的NSString  *)sourceApplication 註釋:(ID 註釋 {  / /注意做爲處理函數傳遞給任何open調用這個處理程序塊應該是徹底相同的。 [ FBSession activeSession setStateChangeHandler  ^(FBSession  * 會話 FBSessionState 狀態 NSError  * 錯誤 { / /檢索應用程序委託 AppDelegate中* 的AppDelegate =  [ 的UIApplication sharedApplication ]。表明;  / /調用應用程序委託的sessionStateChanged:狀態:錯誤的方法來處理會話狀態的變化 [ AppDelegate中sessionStateChanged 會話狀態狀態錯誤錯誤]  }];  返回 [ FBAppCall handleOpenURL 網址sourceApplication sourceApplication ];  }

測試您的登陸流程

按照咱們的測試您的登陸流程指南,以確保您的應用程序的登陸將在一系列共同的條件下工做。


其餘資源

瞭解會議

在本節中:


概觀

當有人成功使用Facebook登陸的應用程序的鏈接,應用程序將可以得到一個訪問令牌,它提供給了Facebook的API臨時的,安全的訪問。訪問級別將取決於權限的用戶授予應用程序。該FBSession類是用來管理,存儲和默認刷新訪問令牌。

本節概述了背後的概念FBSession狀態的生命週期,爲您提供的會話管理功能的背景。有關如何使用您本身的會話令牌緩存來覆蓋默認行爲的信息,您能夠閱讀咱們的管理本身的令牌緩存部分


FBSession國家生命週期

Facebook的SDK使用一個會話狀態機來控制會話的生命週期。這些國家所使用的Facebook的SDK來容許或拒絕訪問其它的Facebook的API,處理訪問令牌存儲或檢索,並處理任何錯誤狀況。

從登陸登出,經過一個典型的生命週期以下圖所示。在這個例子中,咱們尋找一個令牌緩存在應用程序啓動,以提供一個初始登陸於經驗,若是令牌是可用的。若是令牌不存在,咱們顯示一個登陸界面,在這裏用戶能夠觸摸一個按鈕來啓動登陸過程。在此以後,經過身份驗證的用戶能夠應用在使用過程當中被要求提供額外的權限,這揭開序幕一個新的權限請求流將觸發一個UI,要求該權限的用戶。最後,通過身份驗證的用戶能夠經過點擊註銷按鈕退出該應用程序的。

對於每一個進程(應用程序啓動登陸對話框要求額外的權限,並註銷),咱們將顯示出全部的中間狀態,直到操做完成會議將經過一個圖。你只須要關心本身的最後一屆國家爲他們每一個人,這將決定你的應用可使表明用戶的操做。您能夠放心地忽略中間狀態,有你完成處理程序只在最後的狀態行事。

應用程序啓動

爲了檢查是否有緩存的道理,當應用程序被啓動,咱們調用FBSession類方法openActiveSessionWithReadPermissions:allowLoginUI:completionHandler:allowLoginUI設置爲NO。這將防止登陸的用戶界面從顯示和會話將被打開只有當緩存的令牌被發現,但不顯示登陸界面。任何其餘openActiveSession *方法將觸發相同的流量,只要allowLoginUI設置爲NO

下圖顯示了狀態的會話能夠在之後經過openActiveSession *方法被調用allowLoginUI設置爲NO。首先,FBSession.activeSession對象在狀態下建立FBSessionStateCreatedFBSessionStateCreated是狀態的會話時,它存在於,但沒有令牌已被發現(還)。在此以後,若是令牌被發現,該會話將過渡到FBSessionStateCreatedTokenLoaded。並且,從FBSessionStateCreatedTokenLoaded,當會話結束後打開它會過渡到FBSessionStateOpen。只有當會話處於打開狀態,您能夠撥打對方的Facebook的API,只要你有正確的權限。若是找不到令牌,會話將繼續留在FBSessionStateCreated

注意:一旦你建立了一個FBSession.activeSession對象,會話是否成功仍是沒有打開,活動會話會繼續,除非您清除它經過調用相關聯的訪問令牌存在closeAndClearTokenInformation上的活動會話。

而不是調用的靜態之一openActiveSession *方法,你的應用能夠達到一樣的流量按照下列步驟:

  1. 調用一個FBSession實例的init函數。
  2. 檢查狀態值轉換爲FBSessionStateCreated
  3. 若是狀態值FBSessionStateCreated,調用一個FBSession實例打開的功能。

你想使用這個流程,若是你不能使用靜態方法,例如:若是您在緩存標記爲FBSession而不是使用內置的機制本身,和須要傳遞的信息初始化時在會話。

註冊

登陸界面是經過調用觸發FBSession類方法,allowLoginUI:completionHandler:openActiveSessionWithReadPermissionsallowLoginUI設置爲YES強行登陸用戶界面的顯示。

在iOS6的+,試圖使用OS的Facebook系統賬戶登陸。若是Facebook的系統賬戶沒有設置,登陸回退到使用快速應用程序切換到了Facebook的iOS應用或移動Safari。

在iOS6的+登陸流程以下所示:

最初階段是在FBSessionStateCreated。由於咱們迫使SDK中經過使用顯示登陸對話框allowLoginUI:是,咱們的會議將當即過渡到FBSessionStateCreatedOpening,而後顯示登陸對話框FBSessionStateCreatedOpening是狀態的會話中,當試圖登陸的用戶經過用戶界面是正在進行中。若是用戶單擊OK(肯定),狀態轉換到FBSessionStateOpen。若是用戶點擊不容許的狀態轉換爲FBSessionStateClosedLoginFailed。若是未能打開,你能夠顯示給用戶的會話返回錯誤信息,咱們將看到更多的是,當咱們面對一樣的文檔中處理錯誤。

另外,快速應用程序切換的登陸流程以下所示:

正如咱們已經被迫在登陸界面與allowLoginUI:是的,在會話FBSessionStateCreated過渡到FBSessionStateCreatedOpening以前,應用程序切換到Facebook爲iOS或移動Safari。像之前同樣,若是用戶接受在登陸界面的權限,狀態轉換到FBSessionStateOpen。若是用戶觸摸的取消按鈕,狀態轉換到FBSessionStateClosedLoginFailed和錯誤信息提供以及。然而,當所示的對話框,而且當會話狀態FBSessionStateCreatedOpening,用戶能夠按下iOS的Home鍵。在這種狀況下,Facebook的爲iOS沒有路徑發送有關中斷的信息在登陸流程。你能夠經過調用處理這個FBAppCallhandleDidBecomeActive方法,你裏面:applicationDidBecomeActive在你的應用程序委託的方法。這將清除的流動,並最終過渡狀態到FBSessionStateClosedLoginFailed狀態。

要求額外的權限

咱們以前提到的,一旦一個會話處於打開狀態,您能夠撥打對方的Facebook API的前提是你擁有必要的權限。若是你須要,你的應用程序能夠要求額外的權限,當用戶進行身份驗證。該FBSession實例方法requestNew *用於啓動這些流量。

上圖顯示了用戶登陸的系統賬戶爲iOS6的設備的流量。的流動是基本相同的快速應用程序切換的狀況。若是用戶接受的其餘權限,會話狀態轉換到FBSessionStateOpenTokenExtended

若有必要,Facebook的SDK時會自動刷新用戶的會話。當它這樣作,國家也轉換到FBSessionStateOpenTokenExtended狀態。

若是用戶拒絕接受額外的權限則狀態不轉變,仍然在任FBSessionStateOpenFBSessionStateOpenTokenExtended

註銷

當用戶點擊退出按鈕,closeAndClearTokenInformation方法被調用的活動會話,致使如下流程:

這不管從過渡狀態FBSessionStateOpenFBSessionStateOpenTokenExtended,在''''開放狀態,給FBSessionStateClosed

closeAndClearTokenInformation關閉會話清除任何緩存信息,摧毀了會議。這意味着當應用程序從新啓動緩存的令牌將不可用。登陸視圖將被顯示。

另外,調用密切的一個方法FBSession也轉換了狀態FBSessionStateClosed但緩存信息不會被清除和令牌可在下次應用程序啓動時能夠重複使用。使用接近在應用程序委託的方法applicationWillTerminate:方法是一個很好的作法,引起了清理,依賴於一個開放的會話中的任何依賴對象。

一些須要注意的事項

  • 會話只能打開一次。當會話關閉時,它不能被從新打開。相反,一個新的會話應該建立。典型的應用程序只須要在任什麼時候候一個活動會話。Facebook的SDK提供了須要開闢新的會話實例護理靜態活動會話的方法。

  • 可以使用SDK來打開一個會話的不一樣的方法可採起完成處理程序。該處理器成爲與該會話實例相關聯,併爲如下狀態變化被調用:打開OpenTokenExtended休息,和ClosedLoginFailed

管理權限

在本節中:


概觀

在基本的登陸流程,你的應用程序接收到訪問一我的的公衆形象和好友列表。爲了訪問他們的Facebook我的資料的其餘元素,或將內容發佈到Facebook表明他們,你須要請求必要的權限。這些權限能夠在初始登陸時或在應用程序的經驗,任何其它點要求。

若是你想使一個請求到Facebook表明用戶,你須要或者檢查是否有必要的權限,若是沒有請他們,或者直接提出請求並處理缺乏權限偏差要求的權限和重試。

此外,使用您的應用程序的人能夠從Facebook的用戶界面撤消權限,但你也能夠實現一個機制,從您的應用程序中,若是你想這樣作這樣作。您也可讓用戶從你的應用程序中刪除基本的登陸權限,經過實施機制徹底撤銷登陸。

在這部分的指導,咱們將引導您完成:

  • 在登陸請求權限
  • 檢查權限
  • 處理缺失權限
  • 要求額外的權限
  • 撤消權限
  • 撤銷登陸

你能夠找到關於不一樣的可用權限,他們在咱們的意思是什麼樣的信息權限參考


在登陸請求權限

當有人使用Facebook登陸的應用程序的鏈接,應用程序能夠訪問他們的公衆形象和好友列表,信息是對全部人均可見的碎片。要建立這個基本的鏈接,應用程序必須始終經過詢問的請求訪問一我的的公開我的資料信息public_profile許可。一樣,全部其餘部分的信息,有人增長了他們的Facebook的我的資料做抵押落後於其餘的讀取權限。應用程序還須要發佈的權限,以發佈內容的用戶的表明。若是您想了解更多有關權限,你能夠看看咱們的權限參考

你能夠要求任意數量的讀取權限或登陸期間發佈的權限。然而,做爲通常規則,更權限的應用程序的請求,就越有多是人們接受許可請求並繼續登陸過程。咱們的研究代表,提出了四個多權限的應用程序體驗中完成登陸的次數顯著降低了。請求發佈權限與publish_actions登陸過程當中會提示在登陸界面第二步,由於他們有本身的發佈權限的登陸界面後,顯示屏幕的要求,這可能會致使更少的人登陸。所以,咱們建議您請求的讀取權限最低限度登陸時再要求任何額外或發佈權限,當一我的真正須要他們。

您能夠了解如何優化您的權限請求在這裏

要問權限登陸你可使用openActiveSessionWith *權限:*方法。如下是要求的一個例子public_profile(必需)和user_birthday閱讀權限:

(必須)與public_profile / /打開會話和user_birthday閱讀permissions  [ FBSession openActiveSessionWithReadPermissions :@[@ "public_profile" ,  @ "user_birthday" ]  allowLoginUI : YES completionHandler :  ^( FBSession  * session ,  FBSessionState state ,  NSError  * error )  {  __block NSString  * alertText ;  __block NSString  * alertTitle ;  if  (! error ){  //若是會話被成功打開 ,若是 狀態==  FBSessionStateOpen ){  / /你的代碼在這裏 }  不然 {  / /有錯誤,處理它 ,若是 ([ FBErrorUtility shouldNotifyUserForError 錯誤]  == YES ){  / /錯誤要求人們使用的應用程序,使應用程序恢復外的動做 / /該SDK將提供一個咱們必須向用戶顯示錯誤信息 alertTitle =  @ 「去的東西wrong" ;  alertText =  [ FBErrorUtility userMessageForError : error ];  [[[ UIAlertView alloc ] initWithTitle : alertTitle 消息alertText 表明自我 cancelButtonTitle :@ 「OK!」  otherButtonTitles ] ]; }  不然 {  / /若是用戶取消       取消「 ;  alertText =  @ 「你的生日也不會在咱們的日曆輸入,由於你沒有授予的權限」。;  [[[ UIAlertView 的alloc ] initWithTitle alertTitle 消息alertText 表明自我 cancelButtonTitle :@ 「OK!」  otherButtonTitles ] ]; }  其餘 {  / /爲了簡單起見,此示例中,對於全部其餘錯誤,咱們展現一個通用的消息 / /你能夠閱讀更多有關如何處理其餘錯誤在咱們處理錯誤      出了問題「 ;  alertText =  [ NSString的stringWithFormat :@ 「請重試。\ n 若是問題仍然存在,請聯繫咱們,況且這個錯誤代碼:%@「  [ errorInformation objectForKey :@ 「消息」 ]]  [[[ UIAlertView 的alloc ] initWithTitle alertTitle 消息alertText 表明自我 cancelButtonTitle :@ 「OK!」  otherButtonTitles ] ];  }  }  }  }  }];

若是你正在初始化,而後手動打開會話,你能夠將權限添加到會話你正要使用初始化會話打開initWithPermissions: ,或經過指定會話的權限屬性,一旦會話被初始化。


檢查權限

Facebook提供人徹底控制他們授予應用程序的權限。用戶能夠撤銷他們從Facebook的隱私設置,在任什麼時候候給予你的應用程序的權限。他們也能夠拒絕共享權限與您的應用程序在登陸時。所以,應用程序應該檢查權限的當前有效性試圖執行一個API調用以前,例如,檢查publish_actions嘗試出版一本打開圖的故事以前,仍是理所固然的。下面是一個例子:

/ /檢查發佈              數據] objectAtIndex 0 ];  若是 ([!權限objectForKey :@ 「publish_actions」 ]){  / /發佈權限沒有找到,問publish_actions  [ 自我requestPublishPermissions ]; }  不然 {  / /找到發佈權限,發佈OG故事 [ 自我publishStory ];  } }  不然 {  / /有錯誤,處理它 / /見https://developers.facebook.com/docs/ios/errors/  }  }];

處理缺失權限

若是您檢查是否嘗試使用須要它們的API以前,相應的權限,你可千萬別碰上缺乏的權限錯誤。可是,您可報考一個API調用,只要求權限的狀況下,第一次調用因爲權限不在場失敗。若是你須要檢測缺乏權限的錯誤,您可使用使用者資訊的NSError物業,該SDK將返回。若是錯誤是由缺乏權限引發的,它的使用者資訊會看起來像這樣:

 {  「com.facebook.sdk:ErrorSessionKey」  =  「<FBSession:0xa2115f0,狀態:FBSessionStateOpen,loginHandler:0xa211800,的AppID:462857150476058,urlSchemeSuffix:,tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa1567a0>,到期日期:2013年11月24日22:25 :07 +0000,refreshDate:2013年9月25日22:25:08 +0000,attemptedRefreshDate:0001-12-30 00:00:00 +0000,權限:(\ N \「public_profile \」,\ n           須要延長許可:publish_actions「 ;  類型=  OAuthException ;  };  };  代碼=  403 ;  };  }

處理缺乏權限時,您能夠找到關於最佳作法的詳細信息在這裏


要求額外的權限

您能夠在任什麼時候候要求提供活動會話額外的權限。事實上,咱們建議您要求的權限時,您的應用程序實際上須要他們完成由用戶發起的行動。你能夠閱讀更多有關優化權限請求在這裏

下面的示例顯示瞭如何請求publish_actions發佈權限,活動會話。

/ /請求publish_actions  [ FBSession activeSession requestNewPublishPermissions :[ NSArray arrayWithObject :@ "publish_actions" ]  defaultAudience : FBSessionDefaultAudienceFriends  completionHandler :^( FBSession  * session ,  NSError  * error )  {  __block NSString  * alertText ;  __block NSString  * alertTitle ;  if  (! error )  {  if  ([ FBSession . activeSession . permissions indexOfObject :@ 「publish_actions」 ]  ==  NSNotFound ){  / /沒有權限授予,告訴用戶咱們不會公佈 alertTitle =  @ 「未授予權限」 ;  alertText =  @ 「你的行動將不會被髮表到Facebook。」 ;  [ [[ UIAlertView 的alloc ] initWithTitle alertTitle 消息alertText 表明自我 cancelButtonTitle :@ 「OK!」  otherButtonTitles ] ];  }  不然 {  / /授予權限,發佈OG故事 [ 自我publishStory ];  } }  不然 {  / /有錯誤,處理它 / /見https://developers.facebook.com/docs/ios/errors/  }  }];

撤消權限

應用程序可讓人們刪除,或撤銷先前授予的特定權限。例如,應用程序能夠有一個設置頁面,讓人們禁用特定的功能,如出版行爲,和應用程序能夠撤銷publish_actions同時許可。

您能夠經過撥打電話到圖形API端點撤銷特定的權限。若是請求成功,您會收到真正的迴應。在這個例子中,咱們撤銷publish_actions權限:

[ FBRequestConnection startWithGraphPath :@ "/me/permissions/publish_actions"  parameters : nil  HTTPMethod :@ "delete"  completionHandler :^( FBRequestConnection  * connection , id result ,  NSError  * error )  {  __block NSString  * alertText ;  __block NSString  * alertTitle ;  if  (! error && result ==  true )  {  //撤銷許可工做 alertTitle =  @ 「權限成功撤銷」 ;  alertText =  @ 「這個程序將再也不發佈到Facebook表明您。」 }  不然 {  / /有錯誤,處理它 / /見https://developers.facebook.com/docs/ios/errors/  } [[[ UIAlertView 的alloc ] initWithTitle alertTitle 消息alertText 表明自我 cancelButtonTitle :@ 「OK!」  otherButtonTitles ] ];  }];

撤銷登陸

一樣,你能夠撤銷全部權限的應用程序,經過作一個圖表API調用,刪除全部權限。要作到這一點,您可使用代碼在上面的例子中,改變請求的路徑/我/的權限

登陸對話框

在本節中:


概觀

當使用您的應用程序一我的試圖與Facebook登陸,它們將顯示在Facebook的登陸對話框中的一個。這些對話框的功能是容許登陸的人進行身份驗證並授予必要的權限給你的應用程序。此外,他們確保登陸並授予權限的人意識到,他們正在這樣作。其結果是,在登陸對話框不能被旁路。

有不一樣的對話框的Facebook的SDK的的iOS能夠呈現給一我的誰是登陸到您的應用程序使用Facebook。選項有獨立的選擇(不管是經過實現登陸的方式登陸Facebook的按鈕使用API調用自定義UI):SDK將自動爲您選擇最佳的選擇,沒有什麼你須要在你的代碼改變。

本節描述了不一樣的登陸對話框,每一個人的優勢和缺點,以及可用的選項,若是你想自定義的經驗。


Facebook的原生應用程序登陸對話框

Facebook的原生應用程序登陸對話框是徹底自然的。提出這個對話框中爲Facebook的iOS應用軟件作一個快速的應用程序開關,帶來了對Facebook的iOS應用軟件的前景被所示的對話框,同時,並將控制權返回給你的應用程序,一旦用戶完成與它進行交互。爲了讓這個對話合做,Facebook的應用程序的名稱必須在你的應用程序的。plist中下鍵指定FacebookDisplayName。這個鍵的值必須是徹底匹配的顯示名稱字段下在Facebook的應用程序儀表板設置的值。

產品優勢:

  • 100%原生,快。

缺點:

  • 須要爲Facebook的iOS應用軟件V6.0 +安裝。


iOS的原生登陸對話框

在iOS原生的登陸對話框是蘋果的一個特徵Facebook的整合。若是人們經過他們的iOS設置登陸到Facebook,他們可使用這些憑據進行身份驗證到你的應用程序。這是一個設備級認證,這意味着一我的有登陸到您的應用程序,他們利用每一個設備上。

產品優勢:

  • 100%原生,快。
  • 登陸流量不轉換關閉您的應用程序。

缺點:

  • 只有當使用您的應用程序日誌中到Facebook經過人的iOS 6 +中使用。
  • 沒有視覺提示,例如:配置文件被認證的人的照片。
  • 簡化版,當被要求發佈權限提供隱私選擇器給用戶。

特別注意事項:

  • 採用了iOS原生登陸對話框要求您要求的權限時,有一些特殊的考慮。您能夠在閱讀它的iOS集成指南


Facebook的應用程序的Web登陸對話框

提出了在此登陸對話框的Facebook的iOS應用。它至關於Facebook的原生應用程序登陸對話框基於Web的。時,不支持,由於安裝了舊版本的Facebook的爲iOS應用程序的原生版本,它會顯示。

產品優勢:

缺點:

  • 基於Web的對話每每要慢一些。


移動Safari瀏覽器登陸對話框

這個登陸對話框時在移動Safari。它的後備對話框顯示的時候其餘對話框不可用的設備上 - 例如,當一個用戶沒有Facebook應用程序安裝或經過IOS是否是登陸到Facebook上。

產品優勢:

  • 不依賴於具備Facebook上的安裝iOS應用的人。

缺點:

  • 基於Web的對話每每要慢一些。
  • 一般須要的人進入他們的憑據登陸到Facebook上的移動Safari瀏覽器,由於人們一般不登陸Facebook在他們的移動瀏覽器。


嵌入的WebView登陸對話框

這個登陸對話框呈如今你的應用程序嵌入的WebView。這是永遠不會由SDK自動顯示惟一的對話框。你必須通過特別配置以觸發將提交該對話框的代碼。當出現此對話框中的人的用戶名和密碼,必須填寫所要求的權限都以前。

產品優勢:

  • 登陸流量不轉換關閉您的應用程序。

缺點:

  • 基於Web的對話每每要慢一些。
  • 人們不得不在他們的登陸憑據每次經過登陸流動時間填寫。

特別注意事項:

  • 您將須要專門修改您的登陸代碼來觸發此對話框。你能夠學習如何作到這一點在下面的部分,登陸對話框流和控制


控制登陸對話框

Facebook的SDK時會自動選擇基於一我的的裝置的賬戶設置和功能的最佳登陸對話框流量。這是Facebook的SDK實現默認的序列:

  1. Facebook的原生應用程序登陸對話框
  2. Facebook的應用程序的Web登陸對話框
  3. 移動Safari瀏覽器登陸對話框

若是Facebook賬戶沒有設置,Facebook的SDK的檢查,看看Facebook的應用程序是安裝在設備上。若是安裝了Facebook應用程序,若是它的支持,提出了Facebook應用程序本地登陸對話框。若是沒法顯示Facebook的原生應用程序登陸對話框,由於有一個老版本的應用程序,是提出了Facebook應用程序的Web登陸對話框。若是未安裝Facebook應用程序,移動Safari啓動,顯示移動Safari瀏覽器登陸對話框。

您可能但願控制登陸對話框的備用流。

您能夠經過調用打開一個網站會作到這一點openWithBehavior:completionHandler:在一個方法FBSession實例。經過在任何FBSessionLoginBehavior *參數,例如:

/ /初始化一個會話對象 FBSession  * 會話=  [[ FBSession 的alloc ] 初始化]  / /設置活動的會話 [ FBSession setActiveSession 會話];  / /打開會話 [ 會話       應對會話狀態的改變, / /例如:更新視圖 }];

默認狀況下,嵌入的WebView不是默認流的一部分。要添加它做爲一個選項,打開使用的一個網站會話openWithBehavior:completionHandler:該方法FBSession類,並經過在這些中的一個FBSessionLoginBehavior參數:

參數 流程說明

FBSessionLoginBehaviorWithFallbackToWebView

Facebook的應用程序原生>的Facebook應用程序的Web>移動Safari>嵌入的WebView

FBSessionLoginBehaviorForcingWebView

嵌入的WebView

FBSessionLoginBehaviorWithNoFallbackToWebView設置繞過嵌入的WebView。

管理本身的令牌緩存

在本節中:


概觀

Facebook的SDK適用於iOS會自動存儲和獲取有關Facebook的會話管理數據,你的應用程序的照顧。Facebook的SDK中,經過緩存執行此FBSession默認令牌相關的數據。您能夠選擇自行管理緩存的數據,也許經過你的存儲服務器上的這個數據。對於大多數應用程序,你會但願讓Facebook的SDK處理令牌緩存,但也有幾種狀況時,您可能想本身作:

  • 若是你有多個用戶登陸同一臺設備上(您將須要處理多個令牌)。
  • 若是你想提供給用戶進行的跨不一樣設備的無縫登陸體驗(若是用戶登陸在一臺設備,你給他記錄在其餘設備使用相同的標記)。
  • 若是你只是喜歡令牌本地存儲在您的服務器,而不是做爲一個額外的安全層。

遠程緩存一般是在與提供本身的登陸機制,除了Facebook登陸應用程序一塊兒使用。

您可能還須要經過一些其餘途徑建立的令牌。你可使用本身的緩存策略來導入這些標記到你的應用程序。

在本節中,咱們將介紹你所須要知道管理本身的令牌緩存。若是你尚未這樣作,咱們建議您經過閱讀理解會話部分本文件以得到Facebook的會議是如何工做的概述。

咱們將首先解釋令牌緩存是如何工做的,而後咱們將經過令牌緩存實現的示例。若是你想實現多個用戶登陸到您的應用程序的支持,由於是很常見的平板電腦的應用程序,你可能要檢查的SwitchUserSample應用程序,捆綁在一塊兒的SDK,它展現了這個場景。該SwitchUserSample應用程序演示瞭如何容許必定數量的用戶在登陸到應用程序,並根據存儲在一個不一樣的密鑰每一個用戶的會話數據NSUserDefaults

若是遠程緩存會話數據,那麼你應該禁用iOS6的本地登陸對話框流量。本機登陸流程須要用戶從每一個設備登陸。中央令牌緩存機制違反了這一原則,並可能致使身份驗證過程當中不一致的用戶體驗。

如何令牌緩存做品

FBSessionTokenCachingStrategy類負責管理緩存的數據。該數據是一個NSDictionary中,並存儲在NSUserDefaults下的特定鍵。爲了處理本身的緩存,你將須要建立一個子類的自定義類FBSessionTokenCachingStrategy並重寫方法:

  • 保存權杖數據:cacheTokenInformation:cacheFBAccessTokenData: 。這些方法調用的時候FBSession過渡到FBSessionStateOpenFBSessionStateOpenTokenExtended狀態,登陸流量或時期間額外的權限授予。覆蓋cacheFBAccessTokenData:方法,除非你緩存更多的數據,這不是在FBAccessTokenData。若是你須要額外的緩存數據,覆蓋cacheTokenInformation: 。該cacheFBAccessTokenData:方法以一個FBAccessTokenData輸入。

  • 檢索令牌數據:fetchTokenInformationfetchFBAccessTokenData。檢查有效的令牌時,這些方法被調用時,例如當openActiveSession *:allowLoginUI:否被調用。覆蓋fetchFBAccessTokenData方法,除非你緩存更多的數據,這不是在FBAccessTokenData。若是緩存更多的數據,覆蓋fetchTokenInformation。該fetchFBAccessTokenData方法應該返回一個FBAccessTokenData對象。

  • 清除令牌數據:ClearToken中。當所謂的closeAndClearTokenInformation被稱爲上FBSession對象。

FBAccessTokenData令牌數據包含用戶的ACCESS_TOKEN和到期日期,以及包含在該令牌上次刷新的日期和登陸觸發的登陸流程,例如,若是它是一個iOS6的+系統賬戶登陸類型的其餘數據。

當Facebook的SDK管理令牌數據緩存,它存儲在NSUserDefaults下一個名爲'' FBAccessTokenInformationKey鍵''。若要修改其中的數據存儲的關鍵,你須要建立的實例FBSessionTokenCachingStrategy使用類initWithUserDefaultTokenInformationKeyName:方法,並經過它,你想使用的鍵名。而後你須要把你的實例傳遞FBSessionTokenCachingStrategy到FBSession類的初始化方法。Facebook的SDK將存儲在您所選擇的密鑰的令牌數據。


先決條件

爲起點,此文檔的代碼上能夠找到GitHub上。若是你尚未這樣作,克隆的how-to樣本爲Facebook SDK 3.5

git clone命令的https / / github.com/fbsamples/ios-3.5-howtos.git 

而後在打開Xcode項目TokenCacheHowTo /初始文件夾。


樣本概況

完整的示例,用戶能夠經過Facebook登陸。幕後的緩存行爲被改變,以展現如下兩種狀況:

  1. 本地設備高速緩存:在這種狀況下,令牌數據緩存在本地設備上,但在從默認的Facebook SDK的位置,不一樣的位置。從用戶的角度來看的經驗比默認的沒有什麼不一樣。

  2. 遠程服務器的緩存:在這種狀況下,令牌數據被緩存在服務器上。令牌數據能夠從多個設備訪問。這讓第一次使用到一臺設備上登陸,進入到第二個設備,啓動相同的應用程序,並與記錄在體驗開始。

此示例的用戶界面(UI)主罰者經過登陸流量和使用Xcode的調試消息來驗證緩存功能:

供你們參考,已完成的樣品也能夠在GitHub上。已完成的樣品有一個叫作標誌kLocalCacheMyTokenCachingStrategy.m文件,容許你測試本地緩存與遠程緩存。

的初始代碼概述

最初的Xcode項目有Facebook登陸實現的。它包括全部你須要設置示例用戶界面組件。如今缺乏的是Facebook的功能,您將添加管理本身的緩存。

在該項目中使用的主要類和nib文件是:

  • AppDelegate.m:包括Facebook登陸實現支持代碼。

  • ViewController.m:包括一個方法來處理是經過從應用程序委託通知觸發會話狀態的回調。在這個類中的登陸按鈕的方法調用的應用程序委託實現文件相應的方法進行登陸或註銷的人。

  • ViewController.xib:包含一個按鈕與對象的動做綁在一個方法的ViewController實現類。該按鈕鏈接到電源插座,控制按鈕上的文字顯示在登陸或註銷狀態。


第1步:設置本地緩存

在這個步驟中,您將設置一個自定義的類來處理令牌緩存任務和修改FBSession開放的方法來使用你的自定義類。

被緩存的數據是一個NSDictionary中的對象,您能夠將其存儲在屬性列表中,並利用NSDictionary的方法,讓你寫和從屬性列表讀取。

步驟1a:建立一個自定義子類

經過右鍵單擊該項目文件夾中建立一個新的類文件>新建文件> Objective-C類模板。將該類命名爲'''' MyTokenCachingStrategy並選擇NSObject類做爲子類。

接下來,打開MyTokenCachingStrategy頭文件並進行如下代碼更改:

#進口 
#進口 @接口MyTokenCachingStrategy:NSObject的
@接口MyTokenCachingStrategy:FBSessionTokenCachingStrategy

打開MyTokenCachingStrategy實現文件。首先,建立屬性和定義的用來在本地緩存中的數據的屬性列表中的位置的輔助方法:

...  #導入「MyTokenCachingStrategy.h」 / /本地緩存-惟一的文件信息 靜態 的NSString * kFilename =  @ 「TokenInfo.plist」 ; @interface  MyTokenCachingStrategy  ()  @property  ( nonatomic , strong )  NSString  * tokenFilePath ;  -  ( NSString  *) filePath ;  @end @實施 MyTokenCachingStrategy -  ID 的init {  自我 =  [ 的init ];  若是 個體經營 {  _tokenFilePath =  [ 文件路徑];  }  迴歸 自我;  } -  ( NSString  *) filePath {  NSArray  * paths =  NSSearchPathForDirectoriesInDomains ( NSDocumentDirectory ,  NSUserDomainMask , YES );  NSString  * documentsDirectory =  [ paths lastObject ]  返回 [ documentsDirectory stringByAppendingPathComponent kFilename ];  }  ...

接下來,添加了讀取和寫入屬性列表文件的輔助方法:

-  無效的WriteData :(NSDictionary中 *)數據{  的NSLog (@ 「文件=%@和數據=%@」  自我tokenFilePath 數據);  BOOL成功=  [ 數據將writeToFile 自我tokenFilePath原子;]  若是 (!成功 {  的NSLog (@ 「寫入文件時出錯」 );  }  } -  ( NSDictionary  *) readData {  NSDictionary  * data =  [[ NSDictionary alloc ] initWithContentsOfFile : self . tokenFilePath ];  NSLog (@ "File =%@和數據=%@「  自我tokenFilePath 數據), 返回的數據;  }

最後,實施FBSessionTokenCachingStrategy的處理持久性,檢索和的緩存令牌信息結算類方法:

-  ( void ) cacheFBAccessTokenData :( FBAccessTokenData  *) accessToken {  NSDictionary  * tokenInformation =  [ accessToken詞典]  [ 自我的WriteData tokenInformation ];  } -  ( FBAccessTokenData  *) fetchFBAccessTokenData {  NSDictionary  * tokenInformation =  [ self readData ];  if  ( nil  == tokenInformation )  {  return  nil ;  }  else  {  return  [ FBAccessTokenData createTokenFromDictionary : tokenInformation ];  }  } -  無效的ClearToken {  [ 自我的WriteData :[ NSDictionary中dictionaryWithObjectsAndKeys ]];  }

步驟1b:使用自定義類打開會話

打開應用程序委託執行文件。

首先,導入自定義的類的頭文件:

#導入「MyTokenCachingStrategy.h」 

接下來,添加一個私有屬性令牌緩存對象:

@接口 的AppDelegate  () @屬性 非原子 MyTokenCachingStrategy  * tokenCaching ;  @結束 ...

接下來,打開應用程序委託實現類並更換openSessionWithAllowLoginUI:如下定義:

-  BOOL openSessionWithAllowLoginUI :(BOOL allowLoginUI {  BOOL openSessionResult = NO ;  / /設置令牌的策略,若是須要的話 ,若是  == _tokenCaching  {  _tokenCaching =  [[ MyTokenCachingStrategy 的alloc ] 初始化];  }  / /初始化會話對象與     若是顯示登陸界面,或者若是一個緩存的令牌可用, / /而後打開會話。 若是 allowLoginUI | | 會話狀態==  FBSessionStateCreatedTokenLoaded  {  / /爲了進行調試日誌,若是緩存的標記被發現 ,若是 會話狀態==  FBSessionStateCreatedTokenLoaded  {  的NSLog (@ 「。發現緩存標記」 );  }  / /設置活動的會話 [ FBSession setActiveSession 會話]。 。/ /打開會話 [ 會話       狀態狀態 錯誤錯誤]  }]  / /返回結果-將被設置爲從會話當即打開 。/ /打開電話,若是是之前發現了一個緩存的令牌 openSessionResult = 會話isOpen會;  }  返回openSessionResult ;  }

生成並運行該項目,以確保它運行沒有錯誤。點擊登陸按鈕以前,您應該會看到一個調試消息,發現令牌的數據是。點選''''登陸按鈕與Facebook登陸。一旦經過驗證,按鈕上的文字應改成''''註銷。登陸流程完成後,你應該看到的消息顯示,保存在令牌數據。

中止從Xcode中運行的應用程序。您的測試設備,雙擊Home鍵,並從那裏運行以及中止的應用程序。啓動應用程序來測試緩存數據獲取流量。按鈕應該說''''退出做爲緩存的數據從緩存的位置讀取。

從Xcode中從新啓動應用程序。點選''''退出按鈕,並確認按鈕上的文字更改成''''登陸。您應該看到令牌的數據是空的調試消息。中止從Xcode中運行的應用程序一次,並確保應用程序是否是你的測試設備上運行。啓動應用程序。按鈕應該說''''登陸,由於沒有令牌數據已經在緩存中被發現。

與你到哪兒去登陸到Facebook賬戶系統上的iOS6​​的+設備的測試。驗證登陸流量使用的iOS原生登陸對話框。


第2步:設置遠程緩存

在這個步驟中,你將本地存儲在服務器上的標記數據,而不是。

您將添加服務器端代碼來處理傳入的令牌數據和客戶端代碼來發送和接收該數據。

步驟2a:設置服務器端代碼

來測試服務器端的緩存數據存儲,你會創建一個處理HTTP POST請求來存儲數據令牌和一個簡單的端點HTTP GET請求來獲取令牌數據。端點返回與該設置一個'成功'參數JSON響應以'真'時,數據被存儲或檢索的成功和被設置爲'假'在其餘狀況下。

若是你沒有本身的後端服務器,能夠考慮使用解析。服務器端的代碼示例使用PHP編寫,可是你能夠採起相同的概念,並將其應用於你支持執行堆棧。

建立一個文件,並將其命名爲'''' token.php和承載它的服務器上。將如下內容添加到文件中:

<?PHP / /版權全部2004年至今的Facebook。保留全部權利。 / /強制HTTPS上         「https://開頭 $ _SERVER [ 「HTTP_HOST」 ]  $ _SERVER [ 「REQUEST_URI」 ]);  退出();  } / /若是POST,保存權杖的數據,並返回一個成功標誌。 / /若是GET,檢查獨有的信息發送回一個保存權杖的數據。          獲取惟一的id傳遞 $ UNIQUE_ID = 用strip_tags $ _REQUEST [ 'UNIQUE_ID' ]);  / /使用惟一的ID來建立數據存儲文件 $ token_filename = $ UNIQUE_ID  'TXT' ;  $文件= 目錄名__FILE__   '/數據/'  $ token_filename ;  / /獲取令牌數據信息 $ auth_response [ 'token_info' ]  = 用strip_tags $ _REQUEST [ 'token_info' ]);  / / JSON編碼的數據 $數據= 的json_encode $ auth_response ) ;  / /建立一個新文件或覆蓋            沒法寫入文件                數據輸入。「 ;  }  }  不然 ,若是 $ _SERVER [ 'REQUEST_METHOD' ]  ==  'GET'  {  若是 使用isset $ _REQUEST [ 'UNIQUE_ID' ])) {  / /獲取惟一的id傳遞 $ UNIQUE_ID = 用strip_tags $ _REQUEST [ 'UNIQUE_ID' ]);  / /使用惟一的id找到檢查文件 $ token_filename = $ UNIQUE_ID  'TXT' ;  $文件= 目錄名__FILE__   '/數據/'  $ token_filename ;  / /獲取該文件的內容和解碼JSON            沒法讀取文件內容或數據空' ;  }  不然 {  / /返回令牌              數據           方法:'  $ _SERVER [ 'REQUEST_METHOD' ];  } 回聲的json_encode $反應);

建立一個名爲''''數據在PHP文件駐留在同一個目錄下的目錄。若是您將數據存儲在不一樣的目錄,例如:文檔的Web根目錄之外,必定要相應地修改'''' token.php文件。

注:出於安全緣由,在生產設置你不會存儲令牌數據在文件系統中,尤爲是若是它是從網上方便。真實的場景中會涉及到存儲在數據庫中的信息。此外,UNIQUE_ID能夠經過這是由你的服務器所產生的第三者會議上表示。所以,一個可能的用戶流程,更安全的多是如下幾點:

  • 用戶打開你的應用程序,並經過不一樣的登陸機制進行身份驗證對您的服務器。您的應用程序從服務器獲取會話(第三方會話)。
  • 您的應用程序使用第三方會話信息撥打電話到您的服務器,檢查是否有緩存Facebook的令牌。
  • 當Facebook的令牌數據須要被存儲,你的服務器使用的是第三方會話信息調用。本次會議的信息是用來獲取用戶信息和用戶信息是反過來用來存儲Facebook的標記數據。
  • 用戶打開你的應用程序和緩存的令牌須要進行檢查接下來的時間,服務器代碼的第三方會話映射到一個用戶,檢查它的數據庫中檢索令牌數據。

步驟2b:修改遠程存儲的自定義類

打開MyTokenCachingStrategy頭文件,並添加用於識別遠程緩存支持用戶的公共屬性:

/ /在實際應用這個惟一標識用戶和東西 / /應用程序知道一個FBSession開放以前嘗試。 @屬性 非原子 的NSString  * thirdPartySessionId ;

打開MyTokenCachingStrategy實現文件。進行如下修改,以刪除與本地文件緩存的性能和helper方法和添加這些用於遠程數據緩存:

...
#導入「MyTokenCachingStrategy.h」


/ /本地緩存 - 惟一的文件信息
靜態的NSString * kFilename = @「TokenInfo.plist」;

@接口MyTokenCachingStrategy()
@屬性(非原子,強)的NSString * tokenFilePath;
- (的NSString *)文件路徑;
@結束


@實施MyTokenCachingStrategy

- (id)的初始化
{
    自= [超級初始化];
    若是(個體經營){
        _tokenFilePath = [個體經營文件路徑];
        _thirdPartySessionId = @「」;
    }
    迴歸自我;
}


- (的NSString *)文件路徑{
    NSArray的*路徑=
    NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                        NSUserDomainMask,YES);
    的NSString * documentsDirectory = [路徑lastObject];
    返回[documentsDirectory stringByAppendingPathComponent:kFilename];
}

...

你會看到在錯誤的WriteData:READDATA因爲刪除的方法tokenFilePath財產。你會被換出這些方法在短時間內如此忽略這些錯誤如今。

接着,添加代碼來設置遠程緩存:

/ /遠程緩存-後端服務器 的靜態 的NSString * kBackendURL =  @ 「<YOUR_BACKEND_SERVER> / token.php」 ; / /遠程緩存-日期格式 靜態 的NSString * kDateFormat =  @ 「YYYY-MM-dd'T'HH:MM:ss.SSSZZZ」 ; @實施 MyTokenCachingStrategy  ...

更換<YOUR_BACKEND_SERVER>與路徑到你存儲端點token.php或者您的令牌緩存端點。

接下來,添加用於處理服務器的響應助手代碼。這是要使用的的WriteData:READDATA方法:

/ * * Helper方法,用於尋找那些表示日期字符串和 *將它們轉換爲NSDate的對象。 * /  -  的NSMutableDictionary  *)dictionaryDateParse  NSDictionary中 *)數據{  / /日期格式,日期檢查 NSDateFormatter * dateFormatter =  [[ NSDateFormatter 的alloc ] 初始化]  [ dateFormatter setDateFormat kDateFormat ]  / /字典返回 的NSMutableDictionary  * resultDictionary =  [[ 的NSMutableDictionary 的alloc ] 初始化]  / /枚舉經過輸入字典 [ 數據enumerateKeysAndObjectsUsingBlock :^(ID密鑰ID OBJ BOOL * 中止 {  / /檢查字符串是日期 ,若是 ([ obj的isKindOfClass :[ NSString的 ]] ) {  的NSDate  * objDate =  ;  BOOL而isDate =  [ dateFormatter getObjectValue :&objDate forString OBJ ErrorDescription中];  若是 而isDate  {  resultDictionary [ 關鍵]  = objDate ;  [ resultDictionary的setObject objDate forKey 關鍵];  }  不然 {  resultDictionary [ 關鍵]  = obj的;  }  }  不然 {  / /非字符串,只是不停地爲-是 resultDictionary [ 關鍵]  = obj的;  }  }]  返回resultDictionary ;  } / * * Helper方法來檢查後端服務器的響應 *用於讀取和寫入。 * /  -  的NSDictionary  *)用handleResponse :(NSData的 *)responseData {  NSError  * jsonError =  ;  ID結果=  [ NSJSONSerialization  JSONObjectWithData responseData 選項0  錯誤:&jsonError ];  若是 jsonError  {  返回 ;  }  / /檢查格式正確的反應 ,若是 ([ 結果isKindOfClass :[ NSDictionary中 ]]  &&  結果[@ 「 地位」 ]) {  / /檢查若是咱們獲得了一個成功案例回 BOOL成功=  [ 結果[@ 「 身份」 ] boolValue ];  若是 (!成功 {  / /處理錯誤狀況下 的NSLog (@ 「錯誤:%@」 致使[@ 「 的errorMessage」 ] );  返回 ;  }  不然 {  / /檢查返回的標記數據(在讀取請求的狀況下) ,若是 結果[@ 「token_info」 ]) {  / /建立令牌的一個NSDictionary data  NSData  * jsonData =  [ result [@ "token_info" ]  dataUsingEncoding : NSUTF8StringEncoding ];  if  ( jsonData )  {  jsonError =  nil ;  NSDictionary  * tokenResult =  [ NSJSONSerialization  JSONObjectWithData : jsonData 選項0  錯誤:&jsonError ];  若是 jsonError  {  返回 ;  } / /檢查是否有效的數據返回,即不爲零 ,若是 ([ tokenResult isKindOfClass :[ NSDictionary中 ]) {  / /解析結果來處理轉換爲 / /日期                          沒有獲得任何數據返回「 );  返回 ;  }  }

用handleResponse: helper方法後收到響應從讀取或寫入被調用。在讀的狀況下,代碼調用dictionaryDateParse:方法轉換任何的NSString表示日期,對象的NSDate對象。這是爲了確保返回的標記數據是在預期的格式。

接着,添加令牌寫入數據到服務器的代碼。取代之前存在的WriteData:方法:

-  無效的WriteData :(NSDictionary中 *)數據{  的NSLog (@ 「寫-數據=%@」 數據);  NSDateFormatter * dateFormatter =  [[ NSDateFormatter 的alloc ] 初始化]  [ dateFormatter              mutableCopy ]  / /枚舉經過輸入字典 [ 數據enumerateKeysAndObjectsUsingBlock :^(ID密鑰ID 對象BOOL * 中止 {  若是([ 對象isKindOfClass :[ NSDate的 ]) {  COPYDATA [ 關鍵]  =  [ dateFormatter           選項0  錯誤:與錯誤]  若是 錯誤 {  的NSLog (@ 「JSON錯誤:%@」 錯誤);  回報;  }  jsonDataString =  [[ 的NSString 的alloc ] initWithData jsonData 編碼NSUTF8StringEncoding ];  } NSURLResponse  * 響應=  ;  錯誤=  ;  / /設置一個URL請求後端      配置HTTP POST  [ 的URLRequest setHTTPMethod :@ 「POST」 ];  / /經過後的數據:獨特的ID和JSON字符串 令牌/ /表示      setHTTPBody :[ 的postData dataUsingEncoding NSUTF8StringEncoding ]]  / /建立一個同步請求 的NSData  * responseData =  的NSMutableData  *)[ NSURLConnection的 sendSynchronousRequest 的URLRequest returningResponse :&回覆 錯誤:與錯誤]  / /處理返回的數據 [ 自我用handleResponse responseData ];  }

最後,添加代碼以從服務器讀取緩存的令牌數據,併爲你剛剛定義的helper方法的使用。這段代碼取代了之前的READDATA方法:

-  的NSDictionary  *)READDATA {  NSURLResponse  * 響應=  ;  NSError  * 錯誤=  ;  / /設置一個URL請求給後端服務器,一個 具備惟一的ID / / GET請求中傳遞          作一個同步請求 的NSData  * responseData =  的NSMutableData  *)[ NSURLConnection的 sendSynchronousRequest 的URLRequest returningResponse :&回覆 錯誤:與錯誤]  若是  =!responseData  {  / /處理返回的數據 返回 [ 自我用handleResponse responseData ];  }  不然 {  返回 ;  }  }

你會發現,令牌數據讀取和寫入,阻止用戶界面同步HTTP調用。這是一個簡單的機制,這個示例應用程序,以確保FBSession是在正確的狀態,每當應用程序啓動。你應該考慮讓你的現實世界的應用程序請求異步的,尤爲是若是Facebook登陸不適合你的應用程序的功能有直接的要求。

步驟2c:修改會話開放代碼

更改代碼來設置惟一標識一個用戶的屬性。當你初始化你會設置此屬性MyTokenCachingStrategy實例。打開應用程序委託執行文件,並添加修改在相關的代碼openSessionWithAllowLoginUI:方法:

...  若是  == _tokenCaching  {  _tokenCaching =  [[ MyTokenCachingStrategy 的alloc ] 初始化]; / /硬代碼用於演示目的,應設置爲 / /標識應用程序的用戶的惟一價值。 [ _tokenCaching setThirdPartySessionId :@ 「213465780」 ];  }  ...

限制登陸的您容許的類型,謹防不一致,若是用戶的設備之一,不具有iOS6的。你會基本上禁用登陸使用iOS系統的Facebook賬戶憑據的能力。使在下列變化openSessionWithAllowLoginUI:方法在應用程序委託執行文件中找到:

[會議openWithBehavior:FBSessionLoginBehaviorUseSystemAccountIfPresent
[會議openWithBehavior:FBSessionLoginBehaviorWithFallbackToWebView

從測試設備上刪除應用程序。

生成並運行該項目,以確保它運行沒有錯誤。點擊登陸按鈕以前,您應該看到沒有找到數據調試消息。點選''''登陸按鈕與Facebook登陸。一旦經過驗證,按鈕上的文字應改成''''註銷。登陸流程完成後,你應該看到的消息顯示,保存在令牌數據。

中止從Xcode中運行的應用程序。您的測試設備,雙擊Home鍵,並從那裏運行以及中止的應用程序。啓動應用程序來測試緩存數據獲取流量。按鈕應該說''''退出做爲緩存的數據從緩存的位置讀取。

從Xcode中從新啓動應用程序。點選''''退出按鈕,並確認按鈕上的文字更改成''''登陸。您應該看到令牌的數據是空的調試消息。中止從Xcode中運行的應用程序一次,並確保應用程序是否是你的測試設備上運行。啓動應用程序。按鈕應該說''''登陸,由於沒有令牌數據已經在緩存中被發現。

爲了測試中央緩存功能,登陸到緩存服務器上的標記數據。從測試設備上刪除應用程序,以模擬將一個新的設備的用戶。從Xcode中從新啓動應用程序。該應用程序應該在經過身份驗證的狀態開始做爲緩存的標記數據從服務器讀取。你應該看到一個緩存的令牌,發現一個調試消息。

與你到哪兒去登陸到Facebook賬戶系統上的iOS6​​的+設備的測試。驗證登陸流程不使用的iOS原生登陸對話框。


故障排除


附加信息

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息