1

私の新しい iOS アプリでは、Facebook にログインしてユーザーの詳細を取得する必要があります。http://developers.facebook.com/docs/tutorials/ios-sdk-tutorial/authenticate/のチュートリアルを読み、Scrumptious やその他のサンプルについて学習しました。しかし、私はその流れを理解することができません。

Facebook ログインを行うためのサンプル プロジェクトを作成しました (以下のコード) - ただし、主な質問は以下のとおりです。

  • Facebook で [OK] を 1 回クリックした後、[ログイン] ボタンをもう一度クリックすると、アプリが認証を要求するのはなぜですか

以下は私のコードです -

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // See if the app has a valid token for the current state.
    if (FBSession.activeSession.state == FBSessionStateCreatedTokenLoaded)
    {
        // To-do, show logged in view --- LOGGED IN : Already Login
        // Yes, so just open the session (this won't display any UX).
        UIWindow *window = [UIApplication sharedApplication].keyWindow;
        ViewController *rootViewController = (ViewController *)window.rootViewController;
        [rootViewController openSession];        
    }

    return YES;
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
    return [FBSession.activeSession handleOpenURL:url];
}

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


@implementation ViewController

@synthesize lblStatus;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    lblStatus.text = @"Login Now";
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)login:(id)sender
{
    [self openSession];
}

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
        {
            // Connection is Open
            lblStatus.text = @"FBSessionStateOpen";
        }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
        {
            [FBSession.activeSession closeAndClearTokenInformation];

            // Connection is Closed / Login Failed
            lblStatus.text = @"FBSessionStateClosed";
        }
            break;
        default:
            break;
    }
}

- (void)openSession
{
    [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:
     ^(FBSession *session,
       FBSessionState state, NSError *error)
     {
         [self sessionStateChanged:session state:state error:error];
     }];
}

答え---->

提案してくれたnerowolfeに感謝します。

以下は、Facebookに接続するための私の完全なソリューションです。私の次のタスクは、今すぐユーザー データを取得することです。

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation
{
    return [FBSession.activeSession handleOpenURL:url];
}

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

--------------------------

@implementation ViewController

@synthesize lblStatus;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    lblStatus.text = @"Login Now";
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)login:(id)sender
{
    [self openSession];
}

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState) state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen:
        {
            // Connection is Open
            lblStatus.text = @"FBSessionStateOpen";
        }
            break;
        case FBSessionStateClosed:
        case FBSessionStateClosedLoginFailed:
        {
            [FBSession.activeSession closeAndClearTokenInformation];

            // Connection is Closed / Login Failed
            lblStatus.text = @"FBSessionStateClosed";
        }
            break;
        default:
            break;
    }
}

- (void)openSession
{
    if(FBSession.activeSession.isOpen)
    {
        [FBSession openActiveSessionWithReadPermissions:nil
                                           allowLoginUI:NO
                                      completionHandler:
         ^(FBSession *session,
           FBSessionState state, NSError *error)
         {
             [self sessionStateChanged:session state:state error:error];
         }];
    }
    else
    {
        [FBSession openActiveSessionWithReadPermissions:nil
                                           allowLoginUI:YES         
                                      completionHandler:
         ^(FBSession *session,
           FBSessionState state, NSError *error)
         {
             [self sessionStateChanged:session state:state error:error];
         }];
    }
}

- (IBAction)logout:(id)sender
{
    [FBSession.activeSession closeAndClearTokenInformation];

    if(FBSession.activeSession.isOpen)
        lblStatus.text = @"Open Still";
    else
        lblStatus.text = @"Close";

}
4

1 に答える 1

1

LoginUIを表示しないだけです。

 - (void)openSession
{
 if(FBSession.activeSession.isOpen)
 {

       [FBSession openActiveSessionWithReadPermissions:nil
                                   allowLoginUI:NO
                              completionHandler:
                     ^(FBSession *session,
                         FBSessionState state, NSError *error)
       {
        [self sessionStateChanged:session state:state error:error];
       }];
    }

 }
于 2013-07-23T12:19:00.540 に答える