2015-04-03 72 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無法將該令牌保存在鑰匙串中。啓用該功能可以解決問題。

奇怪的是,這是一種無聲的錯誤,所以它不是從爲什麼訪問令牌沒有被設定開始就明確...