Подтвердить что ты не робот

Ios Facebook SDK v4.x доступ к токену, несмотря на вход в систему через FBSDKLoginButton

Мой токен доступа к 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

4b9b3361

Ответ 1

FBSDKApplicationDelegate необходимо сначала вызвать разрешенные кэшированные токены. Поскольку вы устанавливаете контроллер корневого представления немедленно, который вызывает ваш viewDidLoad перед FBSDKApplicationDelegate. Вместо этого вы можете переместить 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;
}

Ответ 2

У меня такая же проблема сегодня, только потому, что я пропустил один шаг:

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

Ответ 3

У меня была проблема, когда я не мог получить токен доступа, потому что я вызываю его до 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 сделаны внутренними. Я не мог получить доступ к этим методам больше в моем коде, так как это дает мне ошибку.

Ответ 4

Вы можете построить логику, ожидающую уведомления FBSDKAccessTokenDidChangeNotification в вашем коде ViewController.

В вашем AppDelegate.m:

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

    // add observer BEFORE FBSDKApplicationDelegate - 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
        }
    }
}

Ответ 5

Случилось также со мной, кнопка "Войти с Facebook" работала так, как ожидалось, меня спрашивали о разрешениях, разрешали их, метод делегата application:openURL:... вызывался с URL-адресом, который казался действительным, тем не менее accessToken свойство осталось ноль.

В моем случае проблема заключалась в том, что каким-то образом Shared Keychain был удален из прав приложения, поэтому SDK для Facebook не смог сохранить токен в цепочке ключей. Включение возможности решения проблемы.

Странно, что это была тихая ошибка, поэтому с самого начала было непонятно, почему токен доступа не был установлен...

Ответ 6

Вместо этого вы должны использовать tokenString, например:

FBSDKAccessToken * access_token = [FBSDKAccessToken currentAccessToken].tokenString; NSLog (@ "Ток доступа,% @", access_token);