react-native logInWithReadPermissions有时不调用safari,没有抛出错误,不调用handle(callback)

时间:2016-05-11 03:59:50

标签: react-native facebook-login

我正在使用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),尽管它不会引发任何错误。 此外,在这种情况下永远不会调用处理程序代码。如果我关闭应用程序并重新打开它,一切都会再次运行。

问题发生在一段时间过后,所以我怀疑它可能与某些超时或令牌过期有关,但我不确定。

我怎么能解决这个问题呢?

1 个答案:

答案 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...
                        }