2013年4月1日 星期一

Facebook SDK

應該有點過時了, 而且那時剛碰SDK應該不少東西寫不好不對, 過陣子再來更新一下

現在的Facebook很令人討厭, iOS6之後有個Social.framework
如果User有在設定那邊登入了Facebook, 登入只會pop個alertView授權
登入授權方式大概如下

iOS版本 | 無FB App, iPhone設定無登入 | 無FB App, iPhone設定有登入
-------------------------------------------------------------------------------------------------------
iOS6     |  Safari授權                            | Pop AlertView授權
iOS5-    |  Safari授權                            | iOS5沒有Social.framework, 沒這動作


iOS版本 | 有FB App, iPhone設定無登入 | 有FB App, iPhone設定有登入
-------------------------------------------------------------------------------------------------------

iOS6     |  FB App授權                         | Pop AlertView授權
iOS5-    |  FB App授權                         | iOS5沒有Social.framework, 沒這動作

先這樣 之後再寫登入方式


2013/4/2
先寫基本的FB設定 首先當然是先下載SDK 安裝好之後Sample Projects可以參考
要將App連結到FB 要先去申請一個App帳號 會得到一組App ID

Xcode Project設定方面 先建立一個新專案 模板選擇Single View
專案建立好之後 開始設定Facebook建置環境

這部分要是看不太懂可以參考官方教學

1. 在Supporting File內的xxx-Info.plist新增兩個row, 分別是
      FacebookAppID 賦值是申請的App ID
      URL types -> Item 0 -> URL Schemes -> Item 0 賦值是申請的App ID前綴fb
2. 在target -> build settings 內, 搜尋other linker flags, 給參數 -lsqlite3.0 -ObjC

3. 加入所需framework, 除了FacebookSDK.framework之外其他用optional
    Social, Account, AdSupport為iOS6才可用
    FacebookSDK.framework為當初安裝Facebook SDK候所在位置 預設是在Documents
    直接拖到專案內的Frameworks資料夾內就好

這樣專案連結FacebookSDK的建置就完成了
登入還是沒寫 下次吧

2013/4/9 說好的登入 照著官網教學 
官網有些東西寫在AppDelegate內 我不太喜歡 我把它都整合到ViewController內

在StoryBoard中的ViewController Scene, 拉一個UIButton上去

官網教學有寫兩個東西 分別是寫在Appdelegate header的
(照我的寫法的話就要改寫在ViewController header, 不過登出才會用到, 所以可以不必加)
extern NSString *const FBSessionStateChangedNotification;
與寫在Appdelegate implement的
(照我的寫法的話就要改寫在ViewController implement, 不過登出才會用到, 所以可以不必加)
NSString *const FBSessionStateChangedNotification = @"com.example.Login:FBSessionStateChangedNotification";
這兩個東西我們登入用不到 登出才需要 有興趣看官網教學

在AppDelegate.m中, 新增下列程式
- (void)applicationDidBecomeActive:(UIApplication *)application {
 // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
 [FBSession.activeSession handleDidBecomeActive];
}
- (void)applicationWillTerminate:(UIApplication *)application {
 // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
 [FBSession.activeSession close];
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
 // attempt to extract a token from the url
 return [FBSession.activeSession handleOpenURL:url];
}

然後再ViewController.m中, 新增下列程式
- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
            if (!error) {
                // We have a valid session
                NSLog(@"User session found");
            }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
            [FBSession.activeSession closeAndClearTokenInformation];
            break;
        default:
            break;
    }
    
    if (error) {
        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:@"Error"
                                  message:error.localizedDescription
                                  delegate:nil
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        [alertView show];
    }
}
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:permissions
             allowLoginUI:allowLoginUI
           completionHandler:^(FBSession *session,
                FBSessionState state,
                NSError *error) {
            [self sessionStateChanged:session
                 state:state
                 error:error];
           }];
}
- (IBAction)authButtonAction:(id)sender {
    [self openSessionWithAllowLoginUI:YES];
}

然後將authButtonAction這Action跟StoryBoard中的Button綁定

這樣就登入的程式碼就寫完了 如果有人有問題可以留言 雖然我不一定會但我盡量吧

2013/4/18 下面這段FBSession的程式碼 雖然是deprecated 但有特殊用途
可以看這邊Tip5
+ (BOOL)openActiveSessionWithPermissions:(NSArray*)permissions
                            allowLoginUI:(BOOL)allowLoginUI
                       completionHandler:(FBSessionStateHandler)handler
 __attribute__((deprecated));

1 則留言:

  1. 請問一下,我在這篇:http://makejobeasier.blogspot.tw/2013/07/facebook-sdk-facebook.html 裡,看到你的留言,我想知道AppDelegate內設定handle openurl的寫法,要如何才不會跳到Safari或是FB app去授權呢? 如何才能利用facebook的dialog直接在app內授權,我的情況是會跳出dialog但是也跳出Safari,路過的ios新手請求解答

    回覆刪除