2012-03-19 6 views
6

업데이트 : 사용자가 이미 내 앱에 Facebook 액세스 권한을 부여한 다음 내 앱을 다시 설치 한 경우에만 아래의 문제가 발생한다는 것을 깨달았습니다. 처음으로 사용자가 내 앱에서 Facebook 버튼을 선택하면 Facebook 앱으로 이동하여 인증을 받지만 인증 상태는 여전히 Facebook 앱에 저장되어 있기 때문에 사용자에게 설명없이 즉시 내 앱으로 돌아갑니다. postToFacebookWall 메서드가 실패합니다.Facebook SDK 페이스 북 앱이 설치된 iOS 로그인

업데이트 2 : 여기에 발견 된 솔루션 구현이 끝났습니다 : How to authorize user through a DIALOG with the NEW Facebook Connect iOS API? 및 Facebook 앱을 피하십시오. 적어도 사 용자가 로그인한다는 메시지가 표시되기 때문에 Safari가 더 좋습니다. 그러나 Feed Dialogue는 이전과 같이 처음 실패합니다.


일반적인 문제가 발생했는데 아직 해결 방법을 찾을 수 없었습니다. 내 앱은 iOS 5 이상으로 제한됩니다.

사용자 벽에 게시 할 수있는 Facebook 버튼이있는 앱이 있습니다. 버튼을 누르면 앱이 사용자가 앱에 이미 벽에 게시 할 권한을 부여했는지 확인합니다. 그럴 경우 벽 게시 정보가있는 피드 대화 상자가있는보기가 나타납니다. 그렇지 않은 경우 Safari가 열리고 사용자는 로그인 할 수 있습니다. 로그인하면 앱으로 돌아가고 피드 대화 상자보기가 나타납니다.

이 기능은 시뮬레이터와 내 장치에서 Facebook 앱이 설치되지 않은 경우 작동합니다. Facebook 앱이 설치되어있는 경우 사용자는 Facebook 앱으로 이동하지만 사용자가 아무 것도하지 않고 즉시 원래 앱으로 돌아갑니다. 피드 대화 상자가 나타나지만 완전히 비어 있고 자동으로 닫힙니다. Facebook 버튼을 다시 누르면 사용자가 앱에 벽에 게시 할 권한을 부여한 것으로 간주되는 피드 대화보기가 나타납니다.

나는 거의 여기 지침 다음 : 여기 http://developers.facebook.com/docs/mobile/ios/build/#implementsso

및 다음 AppDelegate에에서 http://developers.facebook.com/docs/reference/dialogs/feed/

을 나는 다음과 같은 코드를 가지고 :

- (void)loginToFacebook 
{ 
    // Set up facebook 
    self.facebook = [[Facebook alloc] initWithAppId:@"YOUR_APP_ID" andDelegate:self]; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 

    if ([defaults objectForKey:@"FBAccessTokenKey"] 
     && [defaults objectForKey:@"FBExpirationDateKey"]) { 
     self.facebook.accessToken = [defaults objectForKey:@"FBAccessTokenKey"]; 
     self.facebook.expirationDate = [defaults objectForKey:@"FBExpirationDateKey"]; 
    } 

    if (![self.facebook isSessionValid]) { 
     [self.facebook authorize:nil]; 
    } 
} 

// This is an FBSessionDelegate protocol method 
// that gets called after a successful login 
- (void)fbDidLogin 
{ 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults setObject:[self.facebook accessToken] forKey:@"FBAccessTokenKey"]; 
    [defaults setObject:[self.facebook expirationDate] forKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"POST_TO_FACEBOOK_WALL" object:nil]; 
} 

// This is a UIApplicationDelegate protocol method 
// It is called when safari is dismissed 
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication annotation:(id)annotation 
{ 
    return [self.facebook handleOpenURL:url]; 
} 

이 사이의 유일한 차이 샘플 코드는 다음보기 코드에서 NSNotification을 추가 한 것입니다.

- (void)facebookButtonPressed:(UIControl*)sender 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     if (![facebook isSessionValid]) 
     { 
      // Login to facebook if not already logged in 
      [(AppDelegate*)[[UIApplication sharedApplication] delegate] loginToFacebook]; 
     } 
     else 
     { 
      [self postToFacebookWall]; 
     } 

    } 

    - (void)postToFacebookWall 
    { 
     Facebook *facebook = [(AppDelegate*)[[UIApplication sharedApplication] delegate] facebook]; 

     /*Facebook Application ID*/ 
     // TODO: Get this either from the AppDelegate facebook property or the info plist 
     NSString *client_id = @"YOUR_APP_ID"; 

     NSMutableDictionary* params = [NSMutableDictionary dictionaryWithObjectsAndKeys: 
    kAppId, @"app_id", 
    @"http://developers.facebook.com/docs/reference/dialogs/", @"link", 
    @"http://fbrell.com/f8.jpg", @"picture", 
    @"Facebook Dialogs", @"name", 
    @"Reference Documentation", @"caption", 
    @"Using Dialogs to interact with users.", @"description", 
    nil]; 

     [facebook dialog:@"feed" andParams:params andDelegate:self]; 
    } 

누구든지 내 문제를 해결하는 방법을 알고 있습니까? (또한 명확하지 않은 경우 YOUR_APP_ID가 내 코드에서 내 앱 ID로 바뀝니다.)

답변

3

이 경우는 '앱을 설치하고, 인증하고, 제거한 다음 다시 설치해야만하는'시나리오와 비슷합니다.

이 특별한 일이 발생하면 "클래식 웹보기 인증"으로 전환 할 수 있어야합니다.

if (facebookAppDidNotReturnProperly) { 
    // therefore I must have been re-installed 
    // fallback to UIWebView 

    [facebook authorizeWithFBAppAuth:NO safariAuth:NO]; 
} 

는 다시, 당신은 또한 사파리 인증을 사용할 수도 나는 가정한다.

+0

들린다. 나는 그것을 시도 할 것이다. – Darren