2011-08-22 7 views
3

내 프로그램에서이 오류를 어떻게 해결할 수 있습니까? Facebook SDK 사용.Facebook SDK에 로그인하지 않은 사용자 iOS

Error Domain=facebookErrDomain Code=10000 "The operation couldn’t be completed. (facebookErrDomain error 10000.)" UserInfo=0x5da9b10 {error=<CFBasicHash 0x5db09a0 [0x1087400]>{type = mutable dict, count = 2, 
entries => 
    2 : <CFString 0x5db7920 [0x1087400]>{contents = "type"} = <CFString 0x5d35420 [0x1087400]>{contents = "OAuthException"} 
    3 : <CFString 0x5d34970 [0x1087400]>{contents = "message"} = <CFString 0x5da96b0 [0x1087400]>{contents = "Error validating access token: The session is invalid because the user logged out."} 
} 
} 

답변

8

나는 enbr 게시 된 솔루션이 완전하지 않다고 생각합니다. 이유를 설명해 드리겠습니다.

Facebook 세션이 만료되고 이전 액세스 토큰을 계속 사용하면 액세스 토큰 오류가 반환됩니다. 로그 아웃 만이 세션 만료 시나리오가 아닙니다 (예 : 웹 로그인 비밀번호 변경). 따라서 로그 아웃 후 사용자 기본값을 단순히 정리하는 것만으로는 충분하지 않습니다.

클라이언트 측에서는 응답에 이러한 정보가 올 때까지 실제로 유효한 액세스 토큰이 있는지 여부를 알 수 없습니다. 따라서 액세스 토큰 오류를 감지하고 이전 액세스 토큰 및 만료 날짜를 정리하여 Facebook 인스턴스를 작동 상태로 복원해야합니다. 이렇게하면 새 액세스 토큰을 얻으려면 다시 로그인해야합니다.

그래서, IMO, 당신이해야 할 것은 :

  1. 핸들 오류 및 액세스 토큰 오류가 발생하면 감지합니다.

  2. 액세스 토큰 오류가 발생하면 자동으로 로그 아웃하고 사용자 기본값을 정리하여 이전 액세스 토큰을 제거합니다 (3 단계).

  3. 로그 아웃의 결과로 액세스 토큰 및 만료 날짜 (enbr 게시 됨)에 대한 사용자 기본값을 정리해야합니다.

    -(BOOL)isAccessTokenError:(NSError *) error { 
        if ([[error domain] isEqualToString:@"facebookErrDomain"] && [error code] == 10000) { 
         NSDictionary *userInfo = [error userInfo]; 
         NSDictionary *errorAsDictionary = [userInfo objectForKey:@"error"]; 
         if ([[errorAsDictionary objectForKey:@"type"] isEqualToString:@"OAuthException"]) { 
          //Invalid access token 
          return YES;   
         } 
        } 
        if ([[error domain] isEqualToString:@"facebookErrDomain"] && ([error code] == 110 || [error code] == 190)) { 
         //Error accessing access token 
         return YES;   
        } 
        return NO; 
    } 
    

    지역 정보 등의 오류가 처리 할 수있는 :

    - (void)request:(FBRequest*)request didFailWithError:(NSError*)error; 
    - (void)dialog:(FBDialog*)dialog didFailWithError:(NSError *)error; 
    

    난이 도움이되기를 바랍니다 여기

당신은 액세스 토큰 오류를 감지하는 데 사용할 수있는 몇 가지 코드가 있습니다.

업데이트 : 나는 깜빡합니다. SSO 기능을 사용하는 경우 (대부분), 로그인하기 전에 페이스 북 쿠키를 정리하는 것이 좋습니다. 때로는 잘못된 액세스 토큰 오류가 발생한 후 로그인이 "클린 로그인"이 수행되지 않는 한 페이스 북 개체를 작동 상태 (유효한 액세스 토큰)로 되돌릴 수없는 것처럼 보일 때가 있습니다. 항상 작동하지는 않습니다.

또한 SSO 기능을 사용하지 않는 경우 자동으로 다시 사라지는 것으로 보이는 고스트 로그인 팝업을 수정하는 데 사용됩니다.

NSHTTPCookieStorage* cookies = [NSHTTPCookieStorage sharedHTTPCookieStorage]; 
    NSArray* facebookCookies = [cookies cookiesForURL: 
           [NSURL URLWithString:@"http://login.facebook.com"]];  
    for (NSHTTPCookie* cookie in facebookCookies) { 
     [cookies deleteCookie:cookie]; 
    } 
enter code here 
+0

가 h'mmm ... 나는이 문제가있어,이 문제를 해결하기를 희망하지만, 좋은 :

이 내가 쿠키를 청소하지 방법이다. "현재 사용자에 대한 정보를 쿼리하려면 활성 액세스 토큰을 사용해야합니다."라는 오류가 계속 나타납니다. 아주 수수께끼 같아.이상한 일은 언젠가는 잘 작동했지만, 지금은 붙어있는 것 같습니다. UserDefaults에 저장된 쿠키 및 토큰 정보를 삭제하지만 다시 로그인 한 후에도 동일한 오류가 발생합니다. 당 ... – John

1

방금 ​​최근에이 오류가 발생했습니다. 여기에 해결책이 있습니다. 이 코드를 주 FBSessionDelegate (아마도 앱 위임자)에 넣으십시오.

- (void)fbDidLogout { 
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    [defaults removeObjectForKey:@"FBAccessTokenKey"]; 
    [defaults removeObjectForKey:@"FBExpirationDateKey"]; 
    [defaults synchronize]; 
} 

그런 다음 앱을 삭제했다가 다시 설치하십시오.

관련 문제