1

我正在首次尝试将 FB 与 iOS SDK 集成。

到目前为止,我已经成功地与我的 fb 应用程序建立了连接FBLoginView

这是我相应的调用:

-(void)loginViewShowingLoggedInUser:(FBLoginView *)loginView{
   NSLog(@"logged in");
}
-(void)loginViewShowingLoggedOutUser:(FBLoginView *)loginView{
   NSLog(@"logged out");
   [FBSettings setLoggingBehavior:[NSSet setWithObjects:FBLoggingBehaviorFBRequests, nil]];
   if (FBSession.activeSession.isOpen) {
      [FBRequestConnection startForMeWithCompletionHandler:^(FBRequestConnection *connection,id<FBGraphUser> user,NSError *error) {
         if (!error) {
            NSString *fbID = user.id;
            NSLog(@"UserID: %@",fbID);
            NSLog(@"TESTING: %@",user.name);
         }
      }];
   }
}
- (void)loginViewFetchedUserInfo:(FBLoginView *)loginView
                            user:(id<FBGraphUser>)user {
   NSLog(@"Hello %@!", user.first_name);
}
- (void)loginView:(FBLoginView *)loginView handleError:(NSError *)error {
   NSLog(@"FBLoginView encountered an error=%@", error);
}

我有 1 个小问题和 1 个大问题(主题)。

:请求得到满足,我得到了一个很好的日志:

Response Body:
(
        {
        body =         {
            gender = male;
            id = ###;
            ...
        };
        code = 200;
    }
)

但不知何故,我的 2 个测试日志没有显示,有什么想法吗?

大(主题):我在我的应用程序的指定控制器中建立了该连接。我的问题是,每次重新启动应用程序时,连接都会以某种方式丢失(会话不再处于活动状态)。有没有办法使用建立无限连接FBLoginView

我在我的 appdelegate 中添加了以下调用和方法:

//upon start: 
if (![FBSession activeSession].isOpen) {
  [self connectWithFacebook];
}


- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
   //..  
   return [FBSession openActiveSessionWithReadPermissions:permissions
                                             allowLoginUI:allowLoginUI
                                        completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
                                           if (error) {
                                              NSLog (@"Handle error %@", error.localizedDescription);
                                           } else {
                                              [FBSession setActiveSession:session];
                                              [self checkSessionState:state];
                                           }
                                        }];
}
- (void) connectWithFacebook {

   [self openSessionWithAllowLoginUI:YES];
}

- (void) checkSessionState:(FBSessionState)state {
   switch (state) {
      case FBSessionStateOpen:
         break;
      case FBSessionStateCreated:
         break;
      case FBSessionStateCreatedOpening:
         break;
      case FBSessionStateCreatedTokenLoaded:
         break;
      case FBSessionStateOpenTokenExtended:
         // I think this is the state that is calling
         break;
      case FBSessionStateClosed:
         break;
      case FBSessionStateClosedLoginFailed:
         break;
      default:
         break;
   }
}

这允许重新登录,但每次打开应用程序时都会再次显示登录屏幕,这不是很用户友好。有没有解决方案,如果是,我错过了什么或我可以朝什么方向前进?

4

1 回答 1

4

这是我的实现,保持会话打开 60 天(FB SDK 3.2.1 允许的最大时间)

- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI
{
    NSArray *readPermissions = @[@"email",@"friends_birthday",@"friends_likes",@"friends_interests",@"user_birthday",@"user_interests",@"user_likes",@"user_location"];

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

- (void)sessionStateChanged:(FBSession *)session
                      state:(FBSessionState)state
                      error:(NSError *)error
{
    switch (state) {
        case FBSessionStateOpen: {
            // We have a valid session
            NSLog(@"User session found");
            if (FBSession.activeSession.isOpen) {
                [FBRequestConnection
                 startForMeWithCompletionHandler:^(FBRequestConnection *connection,
                                                   id<FBGraphUser> user,
                                                   NSError *error) {
                        if (!error) {
                            NSLog(@"accessToken: %@ userID: %@",[FBSession activeSession].accessTokenData.accessToken,user.id);
                            self.userID = user.id;
                            [[NSUserDefaults standardUserDefaults] setValue:user.first_name  forKey:@"first_name"];
                            [[NSUserDefaults standardUserDefaults] setValue:user.last_name  forKey:@"last_name"];
                            NSString *accessToken = [FBSession activeSession].accessTokenData.accessToken;
                            if (accessToken) {
                                [[NSNotificationCenter defaultCenter] postNotificationName:FacebookLoginInProgressNotification object:nil];
                                [self submitFacebookUserID:user.id andAccessToken:accessToken];
                            }
                            else {
                                NSLog(@"no access token for userID: %@",user.id);
                                [[NSNotificationCenter defaultCenter] postNotificationName:FacebookLoginFailureNotification object:nil];
                            }
                        }
                        else {
                            //handle error retrieving User ID
                            NSLog(@"error retrieving User ID [%@]",[error localizedDescription]);
                            [[NSNotificationCenter defaultCenter] postNotificationName:FacebookLoginFailureNotification object:nil];
                        }
                 }];
            } else {
                [FBSession setActiveSession:session];
            }

            // Pre-fetch and cache the friends for the friend picker as soon as possible to improve
            // responsiveness when the user tags their friends.
            FBCacheDescriptor *cacheDescriptor = [FBFriendPickerViewController cacheDescriptor];
            [cacheDescriptor prefetchAndCacheForSession:session];
        }
            break;
        case FBSessionStateClosed: {
            [FBSession.activeSession closeAndClearTokenInformation];
        }
            break;
        case FBSessionStateClosedLoginFailed: {
            [FBSession.activeSession closeAndClearTokenInformation];
        }
            break;
        default:
            break;
    }

    [[NSNotificationCenter defaultCenter]
     postNotificationName:FBSessionStateChangedNotification
     object:session];

    if (error) {
        NSLog(@"Facebook Error %@", error);
    }
}
于 2013-04-24T18:09:42.250 回答