2015-04-03 75 views
11

尽管按钮显示我已登录,但我的Facebook访问令牌为空。任何人都知道为什么会这样?ios Facebook SDK v4.x访问令牌为空,尽管通过FBSDKLoginButton登录

从RootViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self->login_button = [[FBSDKLoginButton alloc] init]; 
    self->login_button.center = self.view.center; 
    [self.view addSubview:self->login_button]; 

    FBSDKAccessToken* access_token =[FBSDKAccessToken currentAccessToken]; 
    NSLog(@"Access Token, %@",access_token); 
} 

从ApplicationDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    [self.window setRootViewController:[[RootViewController alloc] init]]; 

    [self.window makeKeyAndVisible]; 

    [self.window setBackgroundColor:[UIColor purpleColor]]; 
    [FBSDKLoginButton class]; 
    return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; 
} 

也是我-ObjC链接标志设置

+0

我遇到了同样的问题。我认为这可能与使用FBSDKLoginButton登录方法和FBSDKLoginManager方法有关。 – 2015-04-09 17:30:50

+0

您必须在[[FBSDKApplicationDelegate sharedInstance]应用程序:application didFinishLaunchingWithOptions:launchOptions]后调用FBSDKAccessToken currentAccessToken;然后会出现一个有效的标记。 – 2015-05-22 19:34:46

回答

-1

您应该使用tokenString代替,就像这样:

FBSDKAccessToken * access_token = [FBSDKAccessToken currentAccessToken] .tokenSt环; NSLog(@“Access Token,%@”,access_token);

1

我有一个问题,我无法获得访问令牌,因为我在return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];之前调用它。我需要检查访问令牌以检查用户是否已登录或者不确定哪个应该是我的根视图控制器。我所做的就是我试图通过手动得到从缓存中访问令牌的应用程序didFinishLaunchingWithOptions:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 

    FBSDKProfile *cachedProfile = [FBSDKProfile fetchCachedProfile]; 
    [FBSDKProfile setCurrentProfile:cachedProfile]; 

    FBSDKAccessToken *cachedToken = [[FBSDKSettings accessTokenCache] fetchAccessToken]; 
    NSLog(@"Cached Token: %@", cachedToken.tokenString); 

    if (cachedToken) { 
     //User is logged in, do logic here. 
    } 

    return [[FBSDKApplicationDelegate sharedInstance] application:application 
           didFinishLaunchingWithOptions:launchOptions]; 
} 

您可以通过

UPDATE

检查 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions的实施FBSDKApplicationDelegate.m看到这个方法

这似乎不工作了。我不知道为什么。但似乎fetchCachedProfileaccessTokenCache方法已在内部完成。我无法在我的代码中访问这些方法,因为它给了我一个错误。

11

需要首先调用FBSDKApplicationDelegate来解析缓存的令牌。由于您立即设置了根视图控制器,因此在FBSDKApplicationDelegate之前调用了您的viewDidLoad。相反,你可以向上移动FBSDKApplicationDelegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    // Override point for customization after application launch. 
    [FBSDKLoginButton class]; 
    BOOL r = [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions]; 

    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 

    [self.window setRootViewController:[[RootViewController alloc] init]]; 

    [self.window makeKeyAndVisible]; 

    [self.window setBackgroundColor:[UIColor purpleColor]]; 


    return r; 
} 
4

我今天得到了同样的问题,只是因为我错过了一步:

- (BOOL)application:(UIApplication *)application 
      openURL:(NSURL *)url 
    sourceApplication:(NSString *)sourceApplication 
     annotation:(id)annotation { 

    BOOL handled = [[FBSDKApplicationDelegate sharedInstance] application:application 
                    openURL:url 
                 sourceApplication:sourceApplication 
                   annotation:annotation]; 

    return handled; 
} 
0

你可以建立一个围绕在等待您的视图控制器的代码FBSDKAccessTokenDidChangeNotification通知逻辑。

在你AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    // ... 

    // add observer BEFORE FBSDKApplicationDelegate's - application:didFinishLaunchingWithOptions: returns 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(fbAccessTokenDidChange:) 
               name:FBSDKAccessTokenDidChangeNotification 
               object:nil]; 

    return [[FBSDKApplicationDelegate sharedInstance] application: application  didFinishLaunchingWithOptions: launchOptions]; 
} 

- (void)fbAccessTokenDidChange:(NSNotification*)notification 
{ 
    if ([notification.name isEqualToString:FBSDKAccessTokenDidChangeNotification]) { 
     if ([FBSDKAccessToken currentAccessToken]) { 
      // token is ready to be used in the app at this point 
     } 
    } 
} 
0

这对我来说太,“登录与Facebook”按钮被按预期工作,我被问的权限,允许他们,正被称为application:openURL:...委托方法与一个似乎有效的URL,但accessToken财产仍然无。

在我的情况下的问题是,不知何故Shared Keychain已从应用程序权利中删除,因此Facebook SDK无法将该令牌保存在钥匙串中。启用该功能可以解决问题。

奇怪的是,这是一种无声的错误,所以它不是从为什么访问令牌没有被设定开始就明确...