Étant donné qu'aucune de ces réponses ne répondait réellement à la question, je vais détailler comment j'ai implémenté l'actualisation de jeton OAuth à l'aide de Facebook SDK.
Le SDK actualisera automatiquement vos jetons lorsque vous ferez des requêtes. Dans mon scénario, nous envoyons les jetons à nos serveurs et nous devons utiliser le dernier jeton. Ainsi, lorsque notre serveur indique que nous avons besoin de nouveaux jetons c'est ce que nous faisons:
Remarque Vous pouvez passer le AppID dans le FBSession
ou vous pouvez ajouter la FacebookAppID
clé de votre plist de App (ce qui est ce que nous faisons) .
- (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];
}];
}
}
Le vous pouvez utiliser la méthode sessionStateChanged:
que Facebook inclure dans leur documentation, mais un gestionnaire simplifié ressemble à ceci:
- (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
}
Soyez conscient que certains des appels API FBSession vérifier l'affinité de fil, donc je trouvé que je devais emballer tous mes appels FBSession à l'intérieur d'un dispatch_async(dispatch_get_main_queue(), ^{...
Avez-vous trouvé une réponse à cela? –