網頁

2012年7月4日 星期三

IOS 使用 facebook SDK 教程(一)『Getting Started』

相關文章更新:2012/12/21

【facebook SDK 3.1】what is NEW?

【facebook SDK 3.1】教程1-設定

【facebook SDK 3.1】教程2-登入,認證,登出



==請改用sdk 3.1==

【環境:xCode4.3.2 , ios5.1 , USE ARC】
說明:此教程主要為facebook 2012 08後,官方提供的主要流程。
此教程為文件中的『Getting Started』,理解後的教學執行方式。
在這篇文章中,你可以學到一開始的設定,包含如何在你的app中使用SSO,一鍵授權,一建取銷售權的方法。
官方網站教程:http://developers.facebook.com/docs/mobile/ios/build/#graph

Getting Started

Step 1: Registering your iOS App with Facebook


先到facebook開發者中心,建立你的application,這個application負責溝通facebook去使用facebook允許你的一些動作。
ps:至於如何去申請的facebook的應用程序上,開啓SSO的設定,就請去官方文件參考:Setting up for Facebook iOS App Distribution and Deep Linking

如圖:

Step 2: Installing the iOS SDK


下載XcodeGitClone the GitHub repository
其中GitHub repository裡面的download裡的資料,包含此次要用的facebook ios SDK和他的範例。
當你下載完畢後,首先下面的步驟就是教你如何啓用 Single Sign-On (SSO),這是一個關鍵的執行功能,在這個步驟之後,將會帶你走一次IOS app的設定。

Step 3: Implementing Single Sign-On (SSO)


Single Sign-On (SSO)是一個特別的功能,讓使用者利用 Facebook identity登入你的ios app。
使用者將不需要輸入帳號、密碼等資訊去使用facebook ios app。
此外可以透過facebook app取得使用者的授權資訊,含社交功能和帳戶資訊。

SSO主要的功能就是在他們自己的裝置中,將使用者重新導向到facebook app,因為使用者已經登入facebook,他們將不需要再一次的填寫自己的帳號、密碼。
使用者將看到app提供的『權限驗證對話框』,且會將access_token重新導向到ios app中。

開發者必須瞭解到facebook的SSO機制,會根據用戶的設備安裝,其表現略有不同。
下列在某些IOS的配置上會發生的情況:

  • 若用戶本身有裝facebook開發並發佈的app應用程式,則你的app中的facebook SDK會打開facebook app的驗證對話框。用戶授權或者拒絕後,facebook app會返回到你的app,並傳遞access token, expiration, and any other parameters the Facebook OAuth server may return.
  • 如果沒有安裝3.2.3版本的Facebook app,SDK將打開在Safari手機瀏覽器驗證對話框。用戶授予或撤銷授權後,Safari瀏覽器返回你的app。類似的Facebook app的授權,允許多個應用程序共享相同的Facebook用戶access_token通過Safari瀏覽器的cookie。
  • 若app的程式運行的ios版本,不支持多任務.....(應該是指舊的ios,所以這點不須考慮)

facebook將盡可能會要求使用者去更新到最新的facebook app,所以開發者也追隨facebook的腳步吧....
ps:這點還蠻白爛的....因為像我用shareKit這個套件的話,就被迫強迫更新為最新的版本,不然就不能用摟~~~

將SSO加入到你的app中是非常簡單的一件事情,將在下方跟你介紹。

下面會先教你一開始的程式設定->將你的facebook app access token放入專案中->執行

ps:至於facebook app在官網的開啓sso設定,相當簡單,請到Setting up for Facebook iOS App Distribution and Deep Linking觀看教學

Create your iOS Project

首先建立一個View-based Application project template專案。
並將你下載的IOS Facebook SDK 檔案加入到你的專案中,有幾種方法加入,但最簡單的就是將src這個資料夾的檔案全部拖曳到你的專案中。其中.pch and .xcodeproj files.的兩個檔案可以排除掉,如圖:

Creating an iOS Facebook SDK Static Library
若你在建立你的專案的時候選擇啟用ARC,你必須去使用static library version of the iOS Facebook SDK替代直接拖曳src的方式。
你必須先打開你的command line,並於該資料夾的scripts下執行
 
sh build_facebook_ios_sdk_static_lib.sh

編譯後,就會跑出一段訊息,告訴你創建的static library version of the iOS Facebook SDK存放的位置,將整個檔案加入到你的專案中即可。 

Modify the application delegate header file

Step 1 在你的專案中加入此標頭檔。
#import "FBConnect.h" 
Step 2 在你的class中加入protocol。
@interface MyGreatIOSAppAppDelegate : NSObject <UIApplicationDelegate,FBSessionDelegate>
Step 3.   Set up the application delegate header file by creating instance variable:
Facebook *facebook; 
Step 4.   Add a property for an instance of the Facebook class:
@property (nonatomic, retain) Facebook *facebook; 


Modify the application delegate implementation file


Step 1 Synthesize the facebook property (this creates getter and setter methods):
@synthesize facebook; 

Step 2 Within the body of the application:didFinishLaunchingWithOptions: method create instance of the Facebook class using your app ID (available from the App Dashboard):
facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self];
This instance is used to invoke SSO, as well as the Graph API and Platform Dialogs from within the app.

Step 3.   Once the instance is created, check for previously saved access token information (We will show you how to save this information in Step 6). Use the saved information to set up a "session valid" check by assigning the saved information to the facebook access token and expiration date properties. This ensures that your app does not redirect to the Facebook app and invoke the Auth Dialog if the app already has a valid access_token. If you have asked for offline_access extended permission, then your access token will not expire, but can still get invalidated if the user changes their password or uninstalls your app. Read more on How-To: Handle expired access tokens.
Note: offline_access is deprecated! See the Extending the access token section for information on how to extend the expiration time of an access token for active users of your app.
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if ([defaults objectForKey:@"FBAccessTokenKey"] 
        && [defaults objectForKey:@"FBExpirationDateKey"]) {
        facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"];
        facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"];
} 

Step 4.   Check for a valid session and if it is not valid call the authorize method which will both log the user in and prompt the user to authorize the app:
if (![facebook isSessionValid]) {
    [facebook authorize:nil];
}

Step 5.   Add the application:handleOpenURL: and application:openURL: methods with a call to thefacebook instance:
// Pre iOS 4.2 support
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    return [facebook handleOpenURL:url]; 
}

// For iOS 4.2+ support
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
    return [facebook handleOpenURL:url]; 
} 
The relevant method is called by iOS when the Facebook App redirects to the app during the SSO process. The call to Facebook::handleOpenURL: provides the app with the user's credentials.

Step 6.   Implement the fbDidLogin method from the FBSessionDelegate implementation. In this method you will save the user's credentials specifically the access token and corresponding expiration date. For simplicity you will save this in the user's preferences - NSUserDefaults: 
 
- (void)fbDidLogin {
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:[facebook accessToken] forKey:@"FBAccessTokenKey"];
    [defaults setObject:[facebook expirationDate] forKey:@"FBExpirationDateKey"];
    [defaults synchronize];

} 

最後的長相可能就是下方

Modify the app property list file


最後需要完成的一件事情就是到你的project中的.plist設定相關參數,使你的專案啟用SSO。
找到你建立專案時產生的.plist檔,並在其中按下右鍵新增一行,建立一個URL types,並在URL Schemes中,加入你的 fb[YOUR_APP_ID]  
【注意】必須先是fb的字符串+你去facebook上申請應用程式的APP_ID
如下圖:


到這一步,恭喜你已經完成設定,剩下的就是在你的app加入使用的相關功能。

Test your app


現在只要你輸入好上面的步驟,並填入你所申請的facebook 應用程式 ID,執行你的app後,就會發現認證的對畫框會被打開。
用戶經過確認後,給予你的app權限去訪問他們的facebook信息。
當用戶按下『允許』後,你的app將被授權使用。
若用戶按下『不允許』,則你的app無法被授權。

Step 4: Adding Log Out to your App


當用戶不想在你的app中授權使用他們的帳戶資訊時,就必須使用下列方法去登出
 
[facebook logout];

此將執行 fbDidLogout 的方法,可以藉 FBSessionDelegate 的協議去處理註銷的動作。
注意:執行登出後,你的app將被吊銷登入的權限,將會清除掉app中的access_token。
用戶可經由facebook的隱私設定去修改應用程式權限。
開發者也可以使用Graph API call.去revoke an app's permissions.

接下來就來將logout的按鈕,加到你的app中吧。
    Step 1   加入 logout 按鈕和相關處理程序
    // Add the logout button
    UIButton *logoutButton = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    logoutButton.frame = CGRectMake(40, 40, 200, 40);
    [logoutButton setTitle:@"Log Out" forState:UIControlStateNormal];
    [logoutButton addTarget:self action:@selector(logoutButtonClicked:)
        forControlEvents:UIControlEventTouchUpInside];
    [self.viewController.view addSubview:logoutButton]; 
    
    ps:若是用fb develop上的程式,稍微有點錯誤,在@selector(logoutButtonClicked:)上,少了:的符號

    接下來加入按下按鈕後的動作
    // Method that gets called when the logout button is pressed
    - (void) logoutButtonClicked:(id)sender {
        [facebook logout];
    }
    

    Step 2 添加註銷回調處理程序
     
    - (void) fbDidLogout {
        // Remove saved authorization information if it exists
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        if ([defaults objectForKey:@"FBAccessTokenKey"]) {
            [defaults removeObjectForKey:@"FBAccessTokenKey"];
            [defaults removeObjectForKey:@"FBExpirationDateKey"];
            [defaults synchronize];
        }
    } 
    

儲存,並且執行你的app,按下按鈕後,已經成功地登出,但除非你的app有提示使用者,否則沒有其他視覺上的提示。但若將app全部關掉後,重新執行你的app,則會被要求再次授權。

Step 5: Requesting Additional Permissions

預設情況下,用戶授權app去存取基本公開資訊(一般為facebook的預設情況),若你的app需要更多資訊,你必須從用戶上取得特別的權限。
實現這種方法,是利用NSArray傳遞權限的授權方法。
下方的例子是要求使用者授權的頁面,授權取得user_likes(你說讚的內容)權限read_stream(存取你在動態消息的貼文)權限:
NSArray *permissions = [[NSArray alloc] initWithObjects:
        @"user_likes", 
        @"read_stream",
        nil];
[facebook authorize:permissions];
[permissions release];

在首次登入授權的情況下,將顯示用戶和朋友的權限關係,在範例中(左下圖),這是user_likes(你說讚的內容)權限。
此外延伸的權限將被要求在第二個授權頁面,在範例中(右下圖),這是read_stream(存取你在動態消息的貼文)權限。
你可以參考permissions guide去獲得更多的使用方式。
所有的權限設定請參考permissions guide
在這邊建議,因為你如果設定越多的權限,將會影響用戶的使用心情,會予以授權的用戶將較少。故建議你只跟用戶要求你app中所必須需要的權限即可。

現在讓我們測試一下程式吧,為了讓你剛剛的project更加方便地使用,請將下列的code,加入到你的專案中:
if (![facebook isSessionValid]) {
    NSArray *permissions = [[NSArray alloc] initWithObjects:
            @"user_likes", 
            @"read_stream",
            nil];
        [facebook authorize:permissions];
        [permissions release];
}

使用上述code時,注意,你可以特別用一個按鈕去增加這個額外權限,或者放在一開始登入就立即確認,均可,若你直接使用貼在你的code中,並和之前的if (![facebook isSessionValid])重復到,可能會產生額外的錯誤效果

儲存,並且執行,你就可以看到你的app已經取得用戶的額外權限。




As always , if you have any question , feel free to contact me.
有任何問題,請聯絡我

歡迎轉載,請註明出處,感謝。

9 則留言:

  1. 您好

    我是iOS開發新手

    想請問

    若你在建立你的專案的時候選擇啟用ARC,你必須去使用static library version of the iOS Facebook SDK替代直接拖曳src的方式。
    你必須先打開你的command line,並於該資料夾的scripts下執行

    這段話是什麼意思@@

    不是很了解在哪裡執行command

    回覆刪除
    回覆
    1. 您好

      我了解在哪執行了

      但是在我的scripts資料夾內

      並沒有build_facebook_ios_sdk_static_lib.sh

      這個檔案@@

      刪除
  2. 你好
    現在facebook sdk已經更新到3.1版本
    舊的sdk也可以執行

    但是建議用新版3.1
    在facebook發佈分享上,執行速度會比較快

    這禮拜會把資訊放上

    回覆刪除
    回覆
    1. 大大期待您的分享~感恩!

      刪除
  3. 請問新版3.1
    是指執行sh build_framework.sh
    我執行後會產生build資料夾說...
    另外我用官網的sdk是不是就不用這樣做了呢??他會有兩個資料夾,一個是FacebookSDK.framework,一個是Samples直接載入FacebookSDK.framework 到library就可以了是嗎???
    用git裡面要變成static library要使用這個語法!

    回覆刪除
  4. 您好~大大!
    我發現FacebookSDK.framework如果載入只會載入Headers部分
    裡面沒有FBConnect.h檔案,只有DeprecatedHeaders才有FBConnect.h檔案,這樣上面的例子是不是就不能run了><"

    回覆刪除
  5. 您好

    我想請問

    Facebook新的SDK是否可以在ios5.1中使用

    因為看官網的影片教學是使用ios6

    但是5.1並沒有social.framework

    回覆刪除
  6. 最近工作和私人有點小忙~
    現在的SDK 3.1版本,主要目的是透過ios取得facebook session來達成驗證的功能

    新版的sdk 3.1用的是framework
    我這篇網誌用的facebook是靜態資料庫的用法

    可去facebook的官網看~而facebook針對,使用3.1,但卻非使用ios6的用戶,也有提出方案

    回覆刪除
  7. 相關文章更新:2012/12/21
    【facebook SDK 3.1】what is NEW?
    【facebook SDK 3.1】教程1-設定
    【facebook SDK 3.1】教程2-登入,認證,登出


    ==請改用sdk 3.1==

    回覆刪除