我正在使用FBSDKLoginManager手动登录facebook。 我创建了一个本机方法,其中我有以下代码:
#import "FacebookLoginManager.h"
#import "FBSDKCoreKit/FBSDKCoreKit.h"
#import "FBSDKLoginKit/FBSDKLoginKit.h"
@implementation FacebookLoginManager
RCT_EXPORT_MODULE();
RCT_EXPORT_METHOD(newSession:(RCTResponseSenderBlock)callback) {
dispatch_async(dispatch_get_main_queue(), ^{
FBSDKLoginManager *login = [[FBSDKLoginManager alloc] init];
[login logInWithReadPermissions:@[@"public_profile", @"email"] fromViewController: nil handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
if (error) {
callback(@[@"Error", [NSNull null]]);
} else if (result.isCancelled) {
callback(@[@"Canceled", [NSNull null]]);
} else {
FBSDKAccessToken *token = result.token;
NSString *tokenString = token.tokenString;
NSString *userId = token.userID;
NSDictionary *credentials = @{ @"token" : tokenString, @"userId" : userId };
callback(@[[NSNull null], credentials]);
}
}];
});
};
代码主要起作用,但有时它不会触发登录窗口(safari),尽管它不会引发任何错误。 此外,在这种情况下永远不会调用处理程序代码。如果我关闭应用程序并重新打开它,一切都会再次运行。
问题发生在一段时间过后,所以我怀疑它可能与某些超时或令牌过期有关,但我不确定。
我怎么能解决这个问题呢?
答案 0 :(得分:0)
我意识到在注销时撤销facebook访问令牌解决了这个问题。当用户已经授权您的应用程序并且您尝试再次请求授权时,FBSDKLoginManager可能存在一些问题。 要撤销令牌,我远程调用我的服务器,该服务器有facebook的PHP SDK:
<?php
$fb = new Facebook(array(
'app_id' => 'YOUR_FB_APP_ID',
'app_secret' => 'YOUR_FB_APP_SECRET',
'default_graph_version' => 'v2.5',
));
try
{
$userFbToken = 'user-fb-token-stored-somewhere';
$appsecret_proof = hash_hmac('sha256', $userFbToken, 'YOUR_FB_APP_SECRET');
$response = $fb->delete("/me/permissions", array('appsecret_proof'=>$appsecret_proof),$userFbToken);
}
catch(FacebookResponseException $e)
{
// exception handling...
}