網頁

2012年12月21日 星期五

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

【環境:xCode4.5 , ios6 , USE ARC】
facebook app what is NEW:【facebook SDK 3.1】what is NEW?

facebook app的基本設定,請參考:【facebook SDK 3.1】教程1-設定

說明:
這篇文章,主要在說明,登入-->驗證-->登出 等步驟說明。
若有需要基本設定等,請參考上面文章。

目前facebook login共有三種,現在說明的是目前2012釋放的版本教學。

在新本的SDK 3.1中,若用戶嘗試登入facebook,facebook SDK將會針對目前用戶的設定,選擇最佳的登入方式。
若用戶已經給與ios app權限,SDK將會立即取得token。

現在讓我們開始享受coding的流程吧...

step 1 : include the Facebook SDK
首先建立一個uiviewcontroller,命名為login,將此view設定為windows的rootviewcontroller。
分別在login.m和delegate.m下加入
#import <FacebookSDK/FacebookSDK.h>

step 2 : impelment the login flow

1.在login.m中建立一個uibutton名稱自定,若要跟下面所講的內容一樣的話,那就authButton

2.開啓你的delegate.h檔,建立一個全域變數
extern NSString *const FBSessionStateChangedNotification; 


3.開啓你的delegate.m檔,並定義一個notification string
NSString *const FBSessionStateChangedNotification =
    @"com.example.Login:FBSessionStateChangedNotification";


你要注意的是『com.example.Login』這是你iOS app的bundle id…..

4.接下來,將下列兩個方法放到你的delegate.m中
/*
 * Callback for session changes.
 */
- (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;
    }
    
    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];
    
    if (error) {
        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:@"Error"
                                  message:error.localizedDescription
                                  delegate:nil
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        [alertView show];
    }
}

/*
 * Opens a Facebook session and optionally shows the login UX.
 */
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    return [FBSession openActiveSessionWithReadPermissions:nil
                                          allowLoginUI:allowLoginUI
                                     completionHandler:^(FBSession *session,
                                                         FBSessionState state,
                                                         NSError *error) {
                                         [self sessionStateChanged:session
                                                             state:state
                                                             error:error];
                                     }];
}

5.在你的.h檔中加入
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI;

6.若你需要額外的權限,修改openSessionWithAllowLoginUI:方法

ex:要求email 和 user_likes 的用戶權限
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
    NSArray *permissions = [[NSArray alloc] initWithObjects:
        @"email", 
        @"user_likes",
        nil];
    return [FBSession openActiveSessionWithReadPermissions:permissions
                                              allowLoginUI:allowLoginUI
                                         completionHandler:^(FBSession *session,
                                                         FBSessionState state,
                                                         NSError *error) {
                                         [self sessionStateChanged:session
                                                             state:state
                                                             error:error];
                                     }];
}

7.若你需要寫入的權限,如:public_actions,你必須使用
reauthorizeWithPermissions:defaultAudience:completionHandler: 

permissions guide會有更多相關訊息

8.login flow最大的不同點在於 iOS 6+ 與 早期的iOS版本 兩者。
在iOS 6中,登入時,你的app將傳遞控制權給Facebook iOS app or 手機瀏覽器中的Facebook。
當使用者認證後,控制權將返回給你的app,同時夾帶session的資訊在編碼過的URL中。
為了記錄這些資訊,你需要給在返回的url中做一些處理,在ios6+中,login flow從ios中取得用戶的證書,用戶不需傳送資訊到facebook app。

9.在delegate.m中,分別找到對應的位置,把下面的code塞進去
- (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];
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    [FBSession.activeSession handleDidBecomeActive];
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    [FBSession.activeSession close];
}

10.在你的login.m中
#import "AppDelegate.h"

並將剛剛設定好的button的action,寫成
- (void)authButtonAction
{
    AppDelegate *appDelegate =
    [[UIApplication sharedApplication] delegate];
    
    // If the user is authenticated, log out when the button is clicked.
    // If the user is not authenticated, log in when the button is clicked.
    if (FBSession.activeSession.isOpen) {
        [appDelegate closeSession];
    } else {
        // The user has initiated a login, so call the openSession method
        // and show the login UX if necessary.
        [appDelegate openSessionWithAllowLoginUI:YES];
    }
} 

此時你run project的話會看到兩種畫面,
『根據你的設定會有所不同:有無使用ios 6 內建的facebook帳號登入』
並在log中看到
2012-12-21 18:56:16.832 facebooktest[2725:19a03] User session found

到了這一步...你已經完成了登入+驗證的程序

step 3 : impelment the logout flow

1.在delegate.m中
- (void) closeSession {
    [FBSession.activeSession closeAndClearTokenInformation];
} 

2.在delegate.h中
- (void) closeSession; 

3.改寫你的- (void)authButtonAction
- (void)authButtonAction
{
    AppDelegate *appDelegate =
    [[UIApplication sharedApplication] delegate];
    
    // If the user is authenticated, log out when the button is clicked.
    // If the user is not authenticated, log in when the button is clicked.
    if (FBSession.activeSession.isOpen) {
        [appDelegate closeSession];
    } else {
        // The user has initiated a login, so call the openSession method
        // and show the login UX if necessary.
        [appDelegate openSessionWithAllowLoginUI:YES];
    }
} 

4.在login.m中的viewdidload中
[[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(sessionStateChanged:)
     name:FBSessionStateChangedNotification
     object:nil];

5.在login.m中的- (void)didReceiveMemoryWarning
 
[[NSNotificationCenter defaultCenter] removeObserver:self];

6.在login.n中添加此方法
 
- (void)sessionStateChanged:(NSNotification*)notification {
    if (FBSession.activeSession.isOpen) {
        [self.authButton setTitle:@"Logout" forState:UIControlStateNormal];
    } else {
        [self.authButton setTitle:@"Login" forState:UIControlStateNormal];
    }
}

7.在login.m中的viewdidload中的最後面加上
 
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
[appDelegate openSessionWithAllowLoginUI:NO];


==
到這邊就完成了自建的登入、驗證、註冊...等動作
當然facebook sdk中也有提供login ui的api
不過就不像這種彈性方式了~

最後若有error,請檢查facebook app的設定是否正確.
ex:bundle id沒有設定好,請參考前面的設定文章


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

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

2012年12月20日 星期四

【facebook SDK 3.1】教程1-設定

【環境:xCode4.5 , ios6 , USE ARC】
說明:

facebook SDK 3.1 官方範例下載,下載完畢後須安裝。

官方的source code在此:Note that when building the SDK from source, you must first run scripts/build_framework.sh before compiling and running the samples.

這邊有介紹裡面用的sample code目的為何。

上面零零落落的稍微講一下,若你想知道sdk 3.1的特性有哪些,請參考:【facebook SDK 3.1】what is NEW?


若你想參考如何登入、驗證、登出:【facebook SDK 3.1】教程2-登入,認證,登出


Step 1:Create a facebook app(官方步驟4)

首先,你需要一個建立一個 facebook app ,透過這個app,從用戶那邊取得權限,建立的方式比較特別的應該是『Bundle ID』為必填。
下面就是一個簡單的教學步驟:


1.首先請到這邊,建造你的facebook app,並建立基本資訊

建立好你的facebook app 後,會產生專屬的app ID 顯示在最上方


2.現在你需要將你app中的bundle identifier,使你的facebook app可支援從你的ios app中登入
(這在facebook 3.1中必須的動作)

點選 “Native iOS App”  
Bundle ID:  (必填-請填入你ios app中的設定)
iPhone App Store ID: (選填)
iPad App Store ID: (選填)
Facebook Login: 選擇Enable
Deep Linking: 選擇Enable
URL Scheme Suffix: (選填)



bundle id我想寫過app的人應該知道到哪裡可以找得到。


Step 2:Configure a new xcode project
這個步驟主要是講,你的app該怎樣設定,才可以正確使用facebook framework。

一、有四個framework你必須放到你的專案中:

1.**FacebookSDK.framework  : 在你下載的檔案當中,直接拖進專案。
(以下三個均為xcode已有的framework,加入方法我想大家應該都知道)
2.**Social.framework
3.**Accounts.framework
4.**AdSupport.framework

其中AdSupport.framework,僅有在你必須用到facebook的廣告時,才須設定,要付費,如果你想用facebook行銷,或許這是一個不錯的方法。


二、除了上述四個 framework 外,你還需要放入兩個bundle:
FacebookSDKResources.bundle
FBUserSettingsViewResources.bundle


位置在你剛加入的 Facebook.framework 中的 resources 裡。


三、

若你想要3.1版本同時支援較舊版本的ios....非ios6,且ios 4.3+
請將framework的flag
**Social.framework
**Accounts.framework
**AdSupport.framework

從"Required"選擇成"Optional"



四、在other link中,加入''-lsqlite3.0''


五、info.plist中加入
key:FacebookAppID 
type:string
value:(你申請的Facebook app id)  

六、建立url type
格式為   fb + (你申請的Facebook app id)



後記:
走到這一步,恭喜你已經完成基本設定。
雖然看起來很複雜,但是其實每一個步驟都有他的意義,其時設定久了,也就習慣了。



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

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

【facebook SDK 3.1】what is NEW?

【環境:xCode4.5 , ios5.1 & ios6 , USE ARC】

facebook app的基本設定,請參考:【facebook SDK 3.1】教程1-設定
若你想參考如何登入、驗證、登出:【facebook SDK 3.1】教程2-登入,認證,登出

說明:

首先來分享SDK 3.1有什麼新功能,畢竟工欲善其事、必先利其器,重點還要瞭解他的特性,才能把事情做好。

更快、更簡單的方式,去整合SDK 3.1還有你的iOS app,當然iOS 6是整合的重點,包含:
1.本機facebook login:利用iOS 6去登入facebook的功能,原理應該是,因為你已經利用iOS 6裡面的facebook登入過,所以取得session的方式,也是跟iOS 6拿到,不用再透過scheme的方式,跳到facebook的登入頁,再跳轉回你自己的app,相對的速度上優化許多。

2.分享機制也一樣,透過Native sheet提高分享文章的效能。


因整合ios,故可利用Native 提供的UI元件,讓你更快、更簡單的套用相關功能,如:
Friend Picker、Places Picker、Profile Picture、Login controls 
讓用戶的體驗更加的完善。

ps:不過還是自己打造的元件比較順眼點。

其他特徵包括:
1.與iOS的無縫結合:讓你的app與ios 4.3+版本,更無縫地結合,在iOS6上,更簡單的整合login與分享機制。
2.更簡單的session管理:利用引入的FBSession API,管理、儲存、更新使用者的token。
3.改善API效能:你只需要編寫少量的code去使用Facebook Graph, FQL, and other APIs...等,運用多線程的效能,使用上將更快更完善,讓用戶體驗更好。
4.你可以經由SDK 3.1安裝廣告,去了解有多少用戶使用你的ads,安裝ads可以衡量點擊次數和app的安裝次數。
ps:透過facebook app,也可以看到一些基本資料,如:註冊使用人數...等等。


ps:在這一版的SDK中,也遇過不少問題...因為同時要滿足6和6以下的用戶,又要滿足有些人非用ios6的native facebook,考量的點有很多。


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

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