2016-07-29 5 views
5

Mine은 Objective-C의 iOS 앱으로 로그인 기능을위한 Facebook SDK가 통합되어 있습니다.iOS 앱과 통합 된 페이스 북 로그인 페이지의 간헐적 인 닫기

내 단추를 표시하는 mainview 컨트롤러가 있습니다. 버튼을 클릭하면 아래의 코드가 버튼 핸들러에서 실행됩니다. 이 간헐적 인 페이스 북의 로그인 페이지가 몇 시간 동안 무인/그대로 방치하면 페이스 북의 로그인 페이지가, 우리의 응용 프로그램 내에서 웹보기에 표시됩니다

FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init]; 
    [login 
    logInWithReadPermissions: @[@"public_profile", @"email"] 
    fromViewController:self 
    handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) { 
     if (error) { 
      NSLog(@"Process error %@",error.description); 
     } 
     else if (result.isCancelled) { 
      NSLog(@"Cancelled"); 
     } 
     else { 
      if ([result.grantedPermissions containsObject:kEmail]) { 
       [self fetchfbUserInfo]; 
      } 
      else { 
       NSLog(@"User Declined permissions"); 
      } 
     } 
    }]; 

는 콘솔에 다음과 같은 내용의 오류가을 닫습니다.

FBSDKLog : 오류 다음 SFSafariViewController의 부모보기 컨트롤러가 해산되었다. UIAlertController에서 로그인 을 트리거하는 경우 이런 일이 발생할 수 있습니다. 대신, 최고보기 인 컨트롤러가 조기에 해제되지 않도록하십시오.

몇 가지 리버스 엔지니어링을했고 FBSDKApplicationDelegate 클래스의 대리자 메서드는 오류 메시지가 불려 오지해야 함을 발견했다. (alreay 로그인 한 경우 또는 앱 인증 페이지) 로그인 페이지가 /가 종료 이유에

- (void)viewControllerDidDisappear:(FBSDKContainerViewController *)viewController animated:(BOOL)animated 
{ 
    if (_safariViewController) { 
    [FBSDKLogger singleShotLogEntry:FBSDKLoggingBehaviorDeveloperErrors 
          logEntry:@"**ERROR**:\n The SFSafariViewController's parent view controller was dismissed.\n" 
    "This can happen if you are triggering login from a UIAlertController. Instead, make sure your top most view " 
    "controller will not be prematurely dismissed."]; 
    [self safariViewControllerDidFinish:_safariViewController]; 
    } 
} 

모든 원인은 자신에 일축?

+1

알아 냈습니까? 나는 같은 문제가있다 – Laurent

+1

나는 똑같은 문제가 있다는 것을 알아 냈는가? – erdemgc

+1

나는이 문제를 해결할 수있는 해결책이 있습니까? –

답변

1

iOS 9 이후 FB iOS SDK의 기본 동작은 모바일 Safari를 사용하여 사용자를 인증하는 것입니다 (기본 iOS FB 앱과 반대 됨). 사용자가 Facebook을 사용하여 앱에 로그인하려고 시도했지만 모바일 사파리 (쿠키 없음)로 Facebook에 로그인 한 적이없는 경우 Safari는 사용자가 "Facebook 앱으로 로그인"하도록 제안 된 페이지를로드합니다. 이 버튼을 누르면 사용자가 FB 네이티브 앱으로 이동하므로 사파리 페이지가 닫히고 앱이 백그라운드로 이동합니다. 실제로 로그인 흐름을 취소하고 블록 (isCancelled == true)으로 돌아갑니다.

사용자가 기본 FB 앱에서 권한을 수락하고 앱으로 돌아 오면 이 fb<your-fb-app-id>:// url (액세스 토큰 포함)으로 호출됩니다. FB SDK 로그인 지침에 따르면,이 URL에 전달해야합니다

[[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options]; 

그러나 FBSDKApplicationDelegate 단지 URL을 무시하고 로그인 흐름이 사전에 "취소"때문에 NO를 반환합니다.

제게 이것은 FB SDK의 심각한 버그처럼 보입니다.

- (BOOL) application:(UIApplication*)application openURL:(nonnull NSURL *)url options:(nonnull NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options 
{ 
    BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application openURL:url options:options]; 
    if (!handled) { 
     NSMutableDictionary *launchOptions = [NSMutableDictionary new]; 
     launchOptions[UIApplicationLaunchOptionsSourceApplicationKey] = options[UIApplicationOpenURLOptionsSourceApplicationKey]; 
     launchOptions[UIApplicationLaunchOptionsAnnotationKey] = options[UIApplicationOpenURLOptionsAnnotationKey]; 
     launchOptions[UIApplicationLaunchOptionsURLKey] = url; 
     return [[FBSDKApplicationDelegate sharedInstance] application:application 
           didFinishLaunchingWithOptions:launchOptions]; 
    } 

    return handled; 
} 

위 실제로 FB SDK 내부의 액세스 토큰을 저장합니다 :

나는이 문제를 발견 한 유일한 해결 방법이입니다.

로그인 흐름을 계속하기 위해 위의 FB URL 처리에 따라 호출되는 FBSDKAccessTokenDidChange 알림을 볼 수 있습니다.