2012-10-29 2 views
3

아무 것도 읽지 않습니다 (많은 FB 개발자 기사 및 SO 질문) 도움이되므로 여기에 게시 할 생각입니다. 이 모든 것을 iOS 6 및 Facebook SDK 3.1.1에서 사용할 수 있도록 노력하고 있습니다.iOS 6 Facebook 로그인이 새로 고침되지 않음 액세스 토큰

iOS 앱이 Facebook 인증을 받으면 내 서버에 access_token을 전달하고 사용자가 이제 내 앱에 로그인합니다. 그들이 페이스 북과 관련하여 할 수있는 유일한 다른 일은 벽에 뭔가를 게시하는 것입니다. 사용자가 자신의 설명을 추가 할 수 있도록 기존의 대화 상자 창을 사용하고 있습니다.

모든 것이 처음 1 시간 정도 새 설치에서 완벽하게 작동합니다. 사용자가 iOS 설정 앱을 통해 로그인 한 경우 빠른 IOS 확인 상자가 표시되고 토큰을 받고 내 서버로 보내면 모두 좋습니다.

페이스 북의 액세스 토큰 디버거에받은 토큰을 붙여 넣으면 1 시간 후에 만료됩니다.

{"error_code":190," 
    error_msg":"Error validating access token: 
       Session has expired at unix time 1351497600. 
       The current unix time is 1351525180. } 
  1. 때문에 일이 방금 무슨 일을 내가 어떻게해야합니까 :

    내가 그 시간을 기다린 후 다시 응용 프로그램에 올 경우, 내가하려고 아무것도 나를이 오류를 준다? I've read SDK 3.1.1 FBSession에서이를 처리 할 것이지만 그 경우와 같지는 않습니다. 내 액세스 토큰이 만료되고 일단 실행되면 iOS/FB SDK가 새로 고침을하지 않습니다.

  2. 심지어 로그 아웃하면 ([FBSession.activeSession closeAndClearTokenInformation])이 문제가 해결되지 않습니다. 내가 할 수 있었던 유일한 일은 iOS 시뮬레이터 환경 설정에서 "콘텐츠 및 설정 재설정"이며, Settings.app에서 FB 자격 증명을 다시 입력하고 내 응용 프로그램을 다시 작성합니다. 그래야만 한 시간 후에 만료되는 다른 토큰을 얻을 수 있습니다.

랜덤 노트 : 내 응용 프로그램이 다시 시작했을 때, 나는 위의 링크 된 SO 질문에 따르면

  • [FBSession.activeSession handleDidBecomeActive][self.facebook extendAccessTokenIfNeeded]를 호출하고있어

    1. 는 SDK가 자동으로 FBSession#renewSystemAuthorization를 호출해야합니다. NSLog를 거기에 넣었습니다. 나는 그 메소드가 호출되는 것을 결코 보지 못합니다.

    UPDATE # 1은 :

    나는 SDK가 만료/유효하지 않은 토큰을 처리 할 읽었습니다 언급했다. FBRequestConnection # completeWithResults : orError :에서 발생해야합니다. 코드 경로에 대한 참고 사항은 인라인 주석을 참조하십시오.

    - (void)completeWithResults:(NSArray *)results 
           orError:(NSError *)error 
    { 
        int count = [self.requests count]; 
        for (int i = 0; i < count; i++) { 
         FBRequestMetadata *metadata = [self.requests objectAtIndex:i]; 
         id result = error ? nil : [results objectAtIndex:i]; 
         NSError *itemError = error ? error : [self errorFromResult:result]; 
    
         id body = nil; 
         if (!itemError && [result isKindOfClass:[NSDictionary class]]) { 
          NSDictionary *resultDictionary = (NSDictionary *)result; 
          body = [FBGraphObject graphObjectWrappingDictionary:[resultDictionary objectForKey:@"body"]]; 
         } 
    
         ... 
    
         // ******************************************* 
         // My code actually falls into this block, proving that I do in fact have an invalid session 
         // ******************************************* 
         if ([self isInvalidSessionError:itemError 
             resultIndex:error == itemError ? i : 0]) { 
          [metadata.request.session closeAndClearTokenInformation:itemError]; 
    
          // ******************************************* 
          // Unfortunately metadata.request.session is nil, so this condition is never 
          // run, so renewySystemAuthorization is never called 
          // ******************************************* 
          if (metadata.request.session.loginType == FBSessionLoginTypeSystemAccount){ 
           [FBSession renewSystemAuthorization]; 
         } 
        } 
    
        ... 
    } 
    
  • +0

    오래 지속되는 액세스 토큰이 맞습니까? 만료일은 토큰을 [Debugger] (https://developers.facebook.com/tools/debug)에 입력하면 어떻게됩니까? 내 수명이 긴 토큰은 "만료 : 1356716436 (약 2 개월 후)" –

    +0

    으, 매우 흥미 롭습니다. 좋은 생각. 디버거에 연결하면 (https://developers.facebook.com/tools/debug 모르는 사람들을 위해) "만료 : 1351540800 (약 1 시간 후)"라고 표시됩니다. SDK 문서와 예제를 아주 자세히 읽은 것처럼 느껴집니다. 내 앱은 처음 1 시간 내에 훌륭하게 작동하지만 이후에는 갱신 된 토큰을 얻을 수 없습니다. 어떤 아이디어? – djibouti33

    +0

    앱 대시 보드 설정에 대한 정보를 제공 할 수 있습니까? 고급> 인증 섹션의 설정은 예제로 무엇입니까? 설정에서 생각할 수있는 문서와 다른 점은 무엇입니까? –

    답변

    7

    이것은 이전에 수정 한 유형이 아니지만 예상대로 작동하는 것으로 보입니다. 따라서이 시점에서 배송해야합니다.

    먼저 앱의 이전 버전이 오프라인 액세스를 요청하고있는 것으로 나타났습니다. 난 몰랐어. FB 앱의 설정> 고급으로 이동하여 '오프라인 액세스 권한 삭제'를 사용하도록 설정했습니다. 나는 지금 2 개월 (check out the facbeook token debugger) 계속되는 토큰을 되찾고있다.

    올바른 토큰을 다시 가져 왔으므로 비활성화되었거나 만료되었을 때 유효한 토큰을 다시 가져 오는 데 여전히 문제가 있습니다. 이제 2 개월 토큰이 반환되므로 만료 될 때까지 기다릴 수 없어 내 계정 설정으로 이동하여 인증을 취소하여 OAuthException을 트리거하는 것이 좋습니다.내 appDidBecomeActive에서

    , 나는 [FBRequestConnection startForMeWithCompletionHandler을 : 전무] 넣어 간단하게 FB에 자동 요청을 실행하는 데, 그 때문에/토큰이 유효하지 않은 세션이 실패 할 때, 코드의 흐름은 올바른 경로를 통해 실행하고 [FBSession renewSystemAuthorization] 결국 전화를 받고 결국 궁극적으로 내가 필요로했다. 이것이 iOS가 할 수있게 한 것은 다음 번에 FB를 통해 내 앱에 로그인 할 때 iOS가 유효한 토큰을 더 이상 가지고 있지 않다는 것을 이해하고 다시 묻습니다. [FBSession renewSystemAuthorization]을 호출하면 다음에 내 앱이 액세스를 요청할 때 facebook을 누르고 새로운/새로 고친 토큰을 돌려 줄 것을 iOS에 효과적으로 알립니다.

    모든 부분이 예상대로 작동하고 있습니다.

    +0

    "FB 앱의 설정> 고급을 찾아 어디에서"오프라인 액세스 접근 권한을 제거하십시오 "를 사용할 수 있습니까?"찾지 못했습니다 –

    +0

    , 나는 이것을 두 번 upvote 수 소원 – Erik

    +0

    흠, 삭제 된 것 같습니다 일부 검색은 다음 달에 비추천/삭제되는 것으로 나타납니다. 하지만 아마도 함께 사용하도록 설정하지 않은 경우에는 완전히 숨길 수 있습니다. 해당 단계를 건너 뛰고 나머지 부분을 따라 가서 어디서 볼 수 있는지 확인하십시오. – djibouti33

    관련 문제