2012-12-05 4 views
4

iOS 6을 FacebookSDK와 함께 사용하면 읽기 요청과 게시 권한이 두 번의 개별 호출로 분할됩니다. 나는 왜 이것에 어떤 이점이 있는지 모르겠다. 그러나 Facebook UI를 통해 사용자에게 처음으로 두 번을 보여줄 것을 요구하는 것 같다.FacebookSDK에서 로그인 UI가 두 번 표시됩니다.

내 앱에서 사용자가 Facebook을 사용하기로 선택하기 전까지는 Facebook에서 아무 것도 요청하지 않습니다.이 경우 Facebook에 먼저 읽기 권한을 부여한 다음 다시 게시 권한을받습니다. 컨트롤은 내 앱에서 페이 스북 (읽기 용)에서 내 앱으로 전환 한 다음 즉시 페이스 북 (게시 용)으로 돌아와 내 앱으로 다시 전환합니다.

특히 "확인"이 표시된 페이스 북 화면이 사용자에게 동일하게 보이므로 사용자 경험이 끔찍합니다.

Check for a valid FBSession.activeSession 
if not open call FBSession openActiveSessionWithReadPermissions 
if successful call FBSession.activeSession reauthorizeWithPublishPermissions 
then publish post 

코드는 작동하지만, 사용자 경험은 형편입니다 : (? 왜 두 번 좋아 눌러 AM)

내 코드를 간단히 말해서 같습니다. 내가 놓친 게 있니?

답변

1

iOS 6은 ACAccountStore 지원을 위해 이중 로그인을 요구하므로, Facebook login tutorial은 모든 경우에 대해이를 수행해야 함을 의미합니다. 앱을 두 번 전환하는 것은 나쁜 사용자 환경이며 나는 해결 방법을 생각해 냈습니다.

첫째, 이전 iOS (예 : iOS 5.0)의 경우 openActiveSessionWithPublishPermissions:을 사용하고 하나의 급습에서 읽기 및 게시 권한을 사용할 수 있습니다. 둘째, 사용자가 기기 설정에서 Facebook에 로그인 한 적이없는 경우이 동일한 호출이 작동합니다. 따라서, 다음의 코드는 다음과 같이 작동하는 것 같다 :

사용자가 장치 설정에서 페이스 북에 로그인 한 경우
  • : 읽기 및 게시에 대한 하나의 대화에 대한 하나의 대화.
  • 사용자가 Facebook 앱을 설치 한 경우 : FB 앱으로 한 번 전환하고 2 개의 프롬프트를 연속으로받습니다.
  • 그렇지 않으면 : 한 번 사파리 전환, 나는 3.2.1

    - (BOOL)hasFacebookInDeviceSettings 
    { 
        ACAccountStore *accountStore = [[ACAccountStore alloc] init]; 
        ACAccountType *accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:@"com.apple.facebook"]; 
        BOOL hasFacebookBuiltinAccount = (accountTypeFB != nil); 
        return hasFacebookBuiltinAccount; 
    } 
    
    - (BOOL)hasLoggedInToFacebookInDeviceSettings 
    { 
        if (![self hasFacebookInDeviceSettings]) { 
         return NO; 
        } 
        BOOL result = [SLComposeViewController isAvailableForServiceType:SLServiceTypeFacebook]; 
        return result; 
    } 
    
    - (void)openFacebookSessionWithAllowLoginUI:(BOOL)allowLoginUI 
    { 
        if (![self hasLoggedInToFacebookInDeviceSettings]) { 
         // Simpler if we don't have the built in account 
         [FBSession openActiveSessionWithPublishPermissions:@[@"publish_actions"] 
                  defaultAudience:FBSessionDefaultAudienceFriends 
                   allowLoginUI:allowLoginUI 
                 completionHandler:^(FBSession *session, 
                      FBSessionState state, 
                      NSError *error) { 
                  [self facebookSessionStateChanged:session 
                         state:state 
                         error:error]; 
                 }]; 
        } 
        else if (!FBSession.activeSession.isOpen) { 
         __block BOOL recursion = NO; 
         [FBSession openActiveSessionWithReadPermissions:nil 
                  allowLoginUI:allowLoginUI 
                 completionHandler:^(FBSession *session, 
                      FBSessionState state, 
                      NSError *error) { 
                  if (recursion) { 
                   return; 
                  } 
                  recursion = YES; 
                  if (error || !FBSession.activeSession.isOpen) { 
                   [self facebookSessionStateChanged:session 
                          state:state 
                          error:error]; 
                  } 
                  else { 
                   assert(FBSession.activeSession.isOpen); 
                   if ([FBSession.activeSession.permissions indexOfObject:@"publish_actions"] == NSNotFound) { 
                    [FBSession.activeSession requestNewPublishPermissions:@[@"publish_actions"] 
                             defaultAudience:FBSessionDefaultAudienceFriends 
                             completionHandler:^(FBSession *session, 
                                  NSError *error) { 
                              [self facebookSessionStateChanged:session 
                                     state:FBSession.activeSession.state 
                                     error:error]; 
                             }]; 
                   } 
                  } 
                 }]; 
        } 
    } 
    

    hasFacebookInDeviceSettings 알려줍니다 페이스 북 SDK를 사용하여, iOS6의 및 iOS5를 장치에이 코드를 테스트 행

2 메시지를 얻을 수 이 장치가 설정에서 Facebook을 지원하는 경우 (예 : iOS6 이상).

hasLoggedInToFacebookInDeviceSettings은 사용자가 iOS6 Facebook 기기 설정에서 Facebook에 로그인했는지 알려줍니다.

login tutorial

에 설명 된대로 자신의 facebookSessionStateChanged: 및 기타 코드를 만들어야합니다.
관련 문제