在安裝完iOS版的Facebook SDK與了解完Facebook的Session狀態後,現在我們要開始登入Facebook了。
先前介紹過Facebook的Session狀態,其實Facebook登入的方式很多種,現在我將介紹其中一個開始Session的方式,路徑如下:
第1步:依照"[iOS]在iOS安裝Facebook SDK"建立一個Single View專案
第2步:使用.storybaord建立登場景與登入後的場景
第3步:為"登入"換鈕加上登入Facebook的程式
第4步:於AppDelegate.m中改寫 -application:(UIApplication *)application openURL:(NSURL *)url...,讓Facebook透過Safari登入後,可透過於於.plist設定的URL Schema("fb" + Facebook AppID)回到目前的App中
我是iOS工程師,
Facebook SDK啊,聽說你的Session狀態特別的複雜,那我不就很難搞定登入Facebook的功能?! |
我是Facebook SDK,其實您只要使用
+openActiveSession...:AllowLoginUI:YES, 然後使用者在"授權登入", 在控制好存取代碼就可以了。 |
先前介紹過Facebook的Session狀態,其實Facebook登入的方式很多種,現在我將介紹其中一個開始Session的方式,路徑如下:
第1步:依照"[iOS]在iOS安裝Facebook SDK"建立一個Single View專案
第2步:使用.storybaord建立登場景與登入後的場景
- 2.1 建立LoginController繼承自UIViewController,並設定給.storyboard中預設的ViewController,最後加上1個"登入"按鈕
- 2.2 建立MainController繼承自UIViewController,於.storyboard拉入1個ViewController,並以MainController作為此ViewController的Controller,其中加入1"恭喜您登入Facebook"的文字標籤與1個"登出"按鈕
- 2.3 建立"go_main"轉場Segue,於LoginController登入成功後會進入MainController,包含以下步驟:
- 2.3.1 對LoginController按右鍵,於Triggered Segues中選munual右方的圓點,托拉至MainController中,表示建立LoginController轉場至MainController的轉場Segue
- 2.3.2 選Modal模態模式進行轉場
- 2.3.3 最後選此轉場Segue,並其加上識別字Identifier - "go_main"
- 3.1 為"登入"按鈕掛載loginTouch方法
- 3.2 於LoginController.h透過#import引用Facebook SDK
#import
#import
@interface LoginController : UIViewController
- (IBAction)loginTouch:(id)sender;
@end
- 3.3 於loginTouch方法中透過+openActiveSession allowLoginUI:YES...進行Facebook登入,注意,allowLoginUI:YES,表示一定會開啟Facebook登入的畫面進行登入,若登入成功則透過performSegueWithIdentifier轉場至MainController
- (IBAction)loginTouch:(id)sender {
//透過+[openActiveSession allowLoginUI:YES...]進行Facebook登入
[FBSession openActiveSessionWithReadPermissions:nil
allowLoginUI:YES
completionHandler:^(FBSession *session
, FBSessionState status
, NSError *error) {
//若無error且session的status等於FBSessionStateOpen
//成功登入Facebook開啟連結
if(error == nil && status == FBSessionStateOpen)
{
//則透過轉場識別字"go_main"轉場至MainController
[self performSegueWithIdentifier:@"go_main" sender:self];
}
}];
}
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation
{
//透過handleOpenURL,讓Facebook透過Safari登入後,
//可透過於於.plist設定的URL Schema("fb" + Facebook AppID)回到目前的App中
return [FBSession.activeSession handleOpenURL:url];
}
- 5.1 為"登出"按鈕掛載logoutTouch方法
- 5.2 於MainController.h透過#import引用Facebook SDK
#import
#import
@interface MainController : UIViewController
- (IBAction)logoutTouch:(id)sender;
@end
- 5.3 於logoutTouch方法中透過-
透過closeAndClearTokenInformation關閉session以登出Facebook,在透過-dimessViewController...回到登入場景
- (IBAction)logoutTouch:(id)sender {
//透過closeAndClearTokenInformation關閉session以登出Facebook
[FBSession.activeSession closeAndClearTokenInformation];
//關閉此登出畫面
[self dismissViewControllerAnimated:YES
completion:nil];
}
第6步:執行,按下"登入"按鈕,輸入帳號與密碼,按下"完成"同意授權登入,登入成功後即會進入MainController,最後可按下"登出"按鈕登出Facebook
檔案連結:myiosapp.zip (此Facebook AppID已刪除,僅提供程式參考)
還有什麼要注意的?!
- 還記得+openActiveSession allowLoginUI:YES...中的completionHandler參數嗎,其中我們使用block給予登入後的處理動作,注意,這個block會被session保存下來的,當您透過-close或-closeAndClearTokenInformation登出時,此block會再次被呼叫,因此您要確實的處理session的狀態,以避免程式錯誤的執行。
- 另外,若您使用-close登出,則您的存取代碼accessToken會被快取下來,下次您可透過+openActiveSession allowLoginUI:NO...或-openWithCompletionHandler直接登入,而不需要出現Facebook登入授權的畫面