我的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链接器标志
需要首先调用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;
}
我今天遇到同样的问题,只是因为我错过了一步:
- (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;
}
我有一个问题,我无法获得访问令牌,因为我之前调用它 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
方法已经内部化了。我无法在我的代码中访问这些方法,因为它给了我一个错误。
你可以围绕等待构建逻辑 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
}
}
}
它也发生在我身上,“登录Facebook”按钮按预期工作,我被要求获得权限,允许他们, application:openURL:...
正在使用看似有效的URL调用委托方法,但仍然是 accessToken
财产仍然没有。
在我的情况下的问题是以某种方式的事实 Shared Keychain
已从应用程序权利中删除,因此Facebook SDK无法将令牌保存在钥匙串中。启用该功能解决了该问题。
奇怪的是,这是一个无声的错误,所以从一开始就不清楚为什么没有设置访问令牌......
您应该使用tokenString,如下所示:
FBSDKAccessToken * access_token = [FBSDKAccessToken currentAccessToken] .tokenString;
NSLog(@“Access Token,%@”,access_token);