Поскольку ни один из этих ответов на самом деле не затронул вопрос, я подробно расскажу о том, как я обновил токен OAuth, используя The Facebook SDK.
SDK автоматически обновит ваши жетоны, когда вы делаете запросы, однако в моем сценарии мы отправляем токены на наши серверы, и нам нужно использовать последний токен. Поэтому, когда наш сервер указывает на то, что нам нужны новые маркеры это то, что мы делаем:
Примечание Вы можете либо передать AppID в FBSession
или вы можете добавить FacebookAppID
ключ к вашему PLIST App (это то, что мы делаем) ,
- (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];
}];
}
}
вы можете использовать метод sessionStateChanged:
, что Facebook включать в их документации, но упрощенный обработчик выглядит следующим образом:
- (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
}
Имейте в виду, что некоторые API вызовов FBSession проверить сродством нить, так что я что мне пришлось обернуть все мои вызовы FBSession внутри dispatch_async(dispatch_get_main_queue(), ^{...
Были ли вы готовы ответить на этот вопрос? –