我使用facebook SDK进行身份验证。如果在设置中没有启用Facebook帐户,则单击按钮应用程序将进入safari进行身份验证,即
if (appDelegate.session.state != FBSessionStateCreated)
{
appDelegate.session = [[FBSession alloc] init];
}
[appDelegate.session openWithCompletionHandler:^(FBSession *session,
FBSessionState status,
NSError *error) {
// and here we make sure to update our UX according to the new session state
[self updateView];
}];
否则,如果启用了facebook帐户,则
NSArray *fbAccounts=nil;
ACAccountType *accountTypeFB;
if ((_accountStore = [[ACAccountStore alloc] init]) &&
(accountTypeFB = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){
fbAccounts = [_accountStore accountsWithAccountType:accountTypeFB];
NSLog(@" %d fbAccounts",[fbAccounts count]);
}
if ([fbAccounts count]!=0) {
[FBSession openActiveSessionWithAllowLoginUI:YES];
NSArray *permissions = [[NSArray alloc] initWithObjects:
@"email",
nil];
[FBSession openActiveSessionWithReadPermissions:permissions allowLoginUI:YES completionHandler:^(FBSession *session, FBSessionState status, NSError *error) {
if (error) {
NSLog(@"Failure");
NSLog(@"error %@",error);
}
else
{
NSLog(@" active session opened ");
if (self.gotUserDetails)
{
return;
}
[self fetchuserinfo];
}
}];
}
}
此图像显示访问用户信息的警报。它在模拟器中工作正常。但在设备中,它总是进入safari或Facebook应用程序进行身份验证,即使在设置中启用了Facebook帐户。请帮我找出这个问题。
感谢所有人。
答案 0 :(得分:1)
您不能只是致电accountTypeWithAccountTypeIdentifier
来访问FB帐户,而是需要提供属性。这需要使用requestAccessToAccountsWithType:options:completion:
完成并具有异步响应。
将基于备份网络的身份验证移动到其他方法,然后检查您是否可以按原样创建帐户存储。如果没有,请调用Web方法。如果可以,请尝试使用requestAccessToAccountsWithType:options:completion:
访问FB帐户。在完成块中,您将被授予访问权限,或者您将调用Web方法。
此代码应该全部在主线程上运行。可以在不同的线程上调用异步响应,因此切换回主线程以完成处理。
填写...
部分。
- (void)webAuthorise {...}
- (void)authorise {
if(!_accountStore)
_accountStore = [[ACAccountStore alloc] init];
ACAccountType *facebookTypeAccount = [_accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook];
if (facebookTypeAccount == nil) {
NSLog(@"Failed, No account");
[self webAuthorise];
return;
}
[_accountStore requestAccessToAccountsWithType:facebookTypeAccount
options:@{ACFacebookAppIdKey: @"...", ACFacebookPermissionsKey: @[@"email"]}
completion:^(BOOL granted, NSError *error) {
dispatch_async(dispatch_get_main_queue(), ^{
if(granted){
NSArray *accounts = [_accountStore accountsWithAccountType:facebookTypeAccount];
_facebookAccount = [accounts lastObject];
NSLog(@"Success");
[self ...];
} else {
NSLog(@"Failed, Error: %@", error);
[self webAuthorise];
}
});
}];
}