编辑:还没有解决方法,但是自己的SDK中的Facebook似乎已经弃用了系统FB登录。我尝试了最新的SDK,它完全忽略了系统登录。不幸的是我可以'使用了最新的SDK,尽管使用了"遗产"设置,它仍然返回一个令牌,它不能给我我需要的东西。看看它们如何绕过系统设置可能很有用!
原始问题
我有一个使用Facebook进行身份验证的应用。
我使用的是Facebook SDK(3.13.1 - 最新的pre api v2版本)
如果我尝试进行身份验证,只要我在系统设置中没有设置FB帐户,一切正常。该应用程序启动FB移动应用程序或移动Safari登录,提示我授予必要的权限。
只要系统帐户设置完成,它就会无声地失败。我在两次运行之间删除应用程序,以确保缺少权限不会持续存在。如果我运行SDK附带的一些FB示例应用程序,他们会提示权限,因此很明显我的应用程序或Facebook应用程序的配置存在问题。
我已经看过这两个类似的问题:
Facebook Login - If user account is present (and app is not installed) login fails
Facebook Login error when facebook account is already configured in system preferences
但两者都没有提供适合我情况的答案。 (例如,我确实在Facebook应用程序中配置了包标识符)
我尝试使用自己的自定义登录代码(基于Facebook指南)和使用FBLoginView,两者具有相同的效果。
我还尝试使用ACAccountStore直接向系统存储发出请求,效果相同。有什么想法吗?
我会包含一些代码,但我相当确定代码不是问题 - 如果系统FB帐户未配置,一切正常:(我已经在这里更改了我的FacebookAppIDkey )
ACAccountStore *accountStore = [[ACAccountStore alloc] init];
ACAccountType *facebookType = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
NSDictionary *options = @{ ACFacebookAppIdKey: @"123",
ACFacebookPermissionsKey: @[@"public_profile", @"user_likes", @"user_friends", @"email"],
ACFacebookAudienceKey: ACFacebookAudienceFriends};
[accountStore requestAccessToAccountsWithType:facebookType options:options completion:^(BOOL granted, NSError *error) {
if (granted) {
NSArray *accounts = [accountStore
accountsWithAccountType:facebookType];
id facebookAccount = [accounts lastObject];
DLog(@"%@", facebookAccount);
}
else
{
if (error)
{
DLog(@"%@", error.localizedDescription);
}
}
}];
使用SDK:
[FBSession openActiveSessionWithReadPermissions:@[@"public_profile", @"user_likes", @"user_friends", @"email"]
allowLoginUI:YES
completionHandler:
^(FBSession *session, FBSessionState state, NSError *error) {
AppDelegate* appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
[appDelegate sessionStateChanged:session state:state error:error];
if ([FBSession activeSession].isOpen) {
__typeof__(self) strongSelf = weakSelf;
strongSelf.facebookToken = session.accessTokenData.accessToken;
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, id result, NSError *error)
{
completion(error,(NSDictionary *)result);
}];
} else {
completion(error,nil);
}
}];
答案 0 :(得分:0)
问题可能是因为您已经登录但没有访问令牌。 所以你必须检查条件 if(appDelegate.session.state == FBSessionStateCreatedTokenLoaded)。
希望以下代码能够提供帮助。
VNSAppDelegate *appDelegate = [[UIApplication sharedApplication]delegate];
if (!appDelegate.session.isOpen) {
// create a fresh session object
appDelegate.session = [[FBSession alloc] init];
// if we don't have a cached token, a call to open here would cause UX for login to
// occur; we don't want that to happen unless the user clicks the login button, and so
// we check here to make sure we have a token before calling open
if (appDelegate.session.state == FBSessionStateCreatedTokenLoaded) {
// even though we had a cached token, we need to login to make the session usable
[[appDelegate.session initWithPermissions:appDelegate.permissions]openWithCompletionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
// we recurse here, in order to update buttons and labels
[self updateView];
}];
}