问题 尽管通过FBSDKLoginButton登录,ios Facebook SDK v4.x访问令牌null


我的facebook访问令牌为空,尽管按钮显示我已登录。任何人都知道为什么会这样?

来自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链接器标志


6839
2018-04-03 14:46


起源

我遇到了同样的问题。我认为这可能与使用FBSDKLoginButton登录方法与FBSDKLoginManager方法有关。 - Paul Lehn
你必须在[[FBSDKApplicationDelegate sharedInstance]应用程序之后调用FBSDKAccessToken currentAccessToken:application didFinishLaunchingWithOptions:launchOptions];然后会出现一个有效的令牌。 - Little Tiny Dev


答案:


需要首先调用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;
}

12
2018-05-22 21:32





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

- (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;
}

4
2017-07-24 00:49





我有一个问题,我无法获得访问令牌,因为我之前调用它 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];
}

您可以通过检查实现来查看此方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 在FBSDKApplicationDelegate.m中

UPDATE

这似乎不再起作用了。我不知道为什么。但似乎是 fetchCachedProfile 和 accessTokenCache 方法已经内部化了。我无法在我的代码中访问这些方法,因为它给了我一个错误。


1
2018-05-19 02:32





你可以围绕等待构建逻辑 FBSDKAccessTokenDidChangeNotification ViewController代码中的通知。

在你的 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
2018-01-19 12:59





它也发生在我身上,“登录Facebook”按钮按预期工作,我被要求获得权限,允许他们, application:openURL:... 正在使用看似有效的URL调用委托方法,但仍然是 accessToken 财产仍然没有。

在我的情况下的问题是以某种方式的事实 Shared Keychain 已从应用程序权利中删除,因此Facebook SDK无法将令牌保存在钥匙串中。启用该功能解决了该问题。

奇怪的是,这是一个无声的错误,所以从一开始就不清楚为什么没有设置访问令牌......


0
2017-09-26 21:25





您应该使用tokenString,如下所示:

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


-1
2018-04-23 08:18