2015-04-03 15 views
11

Mã thông báo truy cập facebook của tôi là null mặc dù thực tế là nút cho biết rằng tôi đã đăng nhập. Bất kỳ ai biết tại sao điều này sẽ là?ios Facebook SDK v4.x truy cập mã thông báo mặc dù đã đăng nhập qua FBSDKLoginButton

Từ 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); 
} 

Từ 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]; 
} 

cũng -ObjC mối liên kết cờ tôi được thiết lập

+0

Tôi đang gặp phải vấn đề tương tự. Tôi nghĩ rằng nó có thể có một cái gì đó để làm với việc sử dụng phương pháp FBSDKLoginButton đăng nhập vs các FBSDKLoginManager phương pháp. –

+0

Bạn phải gọi hàm FBSDKAccessToken hiện hànhAccessToken sau ứng dụng [[FBSDKApplicationDelegate sharedInstance]: ứng dụng didFinishLaunchingWithOptions: launchOptions]; Sau đó, một mã thông báo hợp lệ sẽ xuất hiện. –

Trả lời

-1

Bạn nên sử dụng tokenString thay vào đó, như thế này:

FBSDKAccessToken * access_token = [FBSDKAccessToken hiện tạiAccessToken] .tokenSt nhẫn; NSLog (@ "Mã thông báo truy cập,% @", access_token);

1

Tôi gặp sự cố khi không thể nhận Mã thông báo truy cập vì tôi gọi nó trước return [[FBSDKApplicationDelegate sharedInstance] application:application didFinishLaunchingWithOptions:launchOptions];. Tôi cần kiểm tra mã thông báo truy cập để kiểm tra xem người dùng có đăng nhập hay không để quyết định xem bộ điều khiển gốc nào của tôi phải là bộ điều khiển gốc. Những gì tôi đã làm là tôi đã cố gắng để có được thẻ truy cập từ bộ nhớ cache bằng tay trong didFinishLaunchingWithOptions ứng dụng bằng cách:

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

Bạn có thể thấy phương pháp này bằng cách kiểm tra việc thực hiện các - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions trong FBSDKApplicationDelegate.m

CẬP NHẬT

Điều này dường như không hoạt động nữa. Tôi cung không chăc tại sao. Nhưng có vẻ như các phương pháp fetchCachedProfileaccessTokenCache đã được thực hiện nội bộ. Tôi không thể truy cập các phương thức này nữa trong mã của tôi vì nó cho tôi một lỗi.

11

FBSDKApplicationDelegate cần được gọi trước tiên để giải quyết mã thông báo được lưu trong bộ nhớ cache. Vì bạn đang thiết lập bộ điều khiển chế độ xem gốc ngay lập tức, điều đó gọi hàm viewDidLoad của bạn trước FBSDKApplicationDelegate. Thay vào đó, bạn có thể di chuyển FBSDKApplicationDelegate lên:

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

tôi đã cùng một vấn đề ngày hôm nay, chỉ vì tôi đã bỏ lỡ một bước:

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

Bạn có thể xây dựng logic xung quanh chờ đợi FBSDKAccessTokenDidChangeNotification thông báo trong mã ViewController của bạn .

Trong bạn 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

Nó xảy ra với tôi cũng vậy, "Đăng nhập với Facebook" nút đang làm việc như mong đợi, tôi đã được yêu cầu cho phép, cho phép họ, phương pháp application:openURL:... đại biểu đã được gọi là với một URL có vẻ hợp lệ, dù sao thuộc tính accessToken vẫn giữ nguyên.

Vấn đề trong trường hợp của tôi là thực tế là bằng cách nào đó, Shared Keychain đã bị xóa khỏi các quyền của ứng dụng, do đó SDK Facebook không thể lưu mã thông báo trong chuỗi khóa. Cho phép khả năng giải quyết được vấn đề.

Điều kỳ lạ là rằng đây là một lỗi im lặng, vì vậy nó không phải là rõ ràng ngay từ đầu tại sao thẻ truy cập không được thiết lập ...

Các vấn đề liên quan