iOS 6 Login do Facebook não está atualizando o token de acesso
Nada que eu esteja lendo (muitos artigos dev de FB e SO pergunta) está ajudando, então eu pensei em postar aqui. Estou tentando fazer tudo isso funcionar com o iOS 6 e o Facebook SDK 3.1.1.
Eu tenho uma configuração bem básica: Meu aplicativo iOS autentica com o Facebook, eu passo o access_token para o meu servidor e o usuário está logado no meu aplicativo. A única outra coisa que eles podem fazer relacionada ao facebook é postar algo em sua parede. Estou usando a janela de diálogo legado para que o usuário possa adicionar seus próprios comentários.
Tudo funciona perfeitamente em uma nova instalação pela primeira hora ou mais. Se o usuário estiver logado através do aplicativo Configurações do iOS, eles receberão uma caixa de confirmação rápida do iOS, eu recebo o token, o envio para o meu servidor e estamos todos bem.
Se eu colar o token que recebo no depurador do Token de Acesso do Facebook, ele mostrará que ele expirará em uma hora.
Se eu esperar essa hora e voltar para o aplicativo depois, qualquer coisa que eu tente fazer me dá esse erro:
{"error_code":190,"
error_msg":"Error validating access token:
Session has expired at unix time 1351497600.
The current unix time is 1351525180. }
O que preciso fazer para que as coisas funcionem?Eu li que no SDK 3.1.1 o FBSession apenas cuidará disso, mas isso não parece ser o caso. Meu token de acesso está expirando e, quando isso acontece, o SDK do iOS / FB não me restituirá um novo.Mesmo fazendo logout (que chama[FBSession.activeSession closeAndClearTokenInformation]
) não resolve isso. A única coisa que consegui fazer foi "Redefinir conteúdo e configurações" nas Preferências do Simulador do iOS, insira novamente minhas credenciais do FB em Settings.app e reconstrua meu aplicativo. Só então eu posso obter outro token que irá expirar em uma hora.Notas aleatórias:
Quando meu aplicativo é retomado, estou ligando[FBSession.activeSession handleDidBecomeActive]
e[self.facebook extendAccessTokenIfNeeded]
De acordo com a pergunta do SO vinculada acima, o SDK deve estar chamando automaticamenteFBSession#renewSystemAuthorization
. Eu coloquei um NSLog lá, e nunca vejo esse método sendo chamado.ATUALIZAÇÃO 1:
Mencionei que li que o SDK lidará com tokens inválidos / expirados. Parece que isso deve acontecer em FBRequestConnection # completeWithResults: orError :. Veja comentários embutidos para notas sobre o caminho do código.
- (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];
}
}
...
}