Dado que ninguna de estas respuestas en realidad aborda la pregunta, voy a detallar cómo he implementado la actualización de tokens de OAuth usando The Facebook SDK.
El SDK actualizará automáticamente sus tokens cuando realice solicitudes, sin embargo, en mi caso, enviamos los tokens a nuestros servidores y necesitamos usar el último token. Por eso, cuando nuestro servidor indica que necesitamos nuevas fichas de esto es lo que hacemos:
Nota Puede pasar el AppID en el FBSession
o puede agregar la clave FacebookAppID
a su plist de aplicación (esto es lo que hacemos) .
- (void)renewFacebookCredentials {
if (FBSession.activeSession.state == FBSessionStateOpen ||
FBSession.activeSession.state == FBSessionStateOpenTokenExtended) {
[self sessionStateChanged:[FBSession activeSession] state:[FBSession activeSession].state error:nil];
} else {
// Open a session showing the user the login UI
// You must ALWAYS ask for public_profile permissions when opening a session
[FBSession openActiveSessionWithReadPermissions:@[@"public_profile",@"email"]
allowLoginUI:NO
completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {
//this block will run throughout the lifetime of the app.
[self sessionStateChanged:session state:state error:error];
}];
}
}
La puedes usar el método sessionStateChanged:
que Facebook incluir en su documentación pero un encargado simplificada se ve así:
- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error {
// If the session was opened successfully
NSString *accessToken;
if (!error && state == FBSessionStateOpen && [[session accessTokenData] accessToken]){
// Show the user the logged-in UI
//@see http://stackoverflow.com/questions/20623728/getting-username-and-profile-picture-from-facebook-ios-7
accessToken = [[session accessTokenData] accessToken];
//Now we have an access token, can send this to the server...
} else {
//No access token, show a dialog or something
}
//either call a delegate or a completion handler here with the accessToken
}
Tenga en cuenta que algunas de las llamadas a la API FBSession comprobar si hay afinidad hilo por lo que descubrí que tenía que envolver todas mis llamadas de FBSession dentro de un dispatch_async(dispatch_get_main_queue(), ^{...
¿Habría sido capaz de encontrar una respuesta a esto? –