iOS本机Facebook登录无法进行Mobile Safari身份验证
我有一个集成了Facebook登录的本机iOS应用程序。当安装本机Facebook应用程序时,登录流工作 但是,当我删除该应用程序时,FB登录会在FB Mobile Safari webapp上回退。应用程序切换工作正常,但当控件返回到我的应用程序时,会话状态声明为FBSessionStateClosedLoginFailed 截至2013年6月6日,我正在使用Facebook SDK v3.5.2 使用iPad1 iOS5.1.1iOS本机Facebook登录无法进行Mobile Safari身份验证,facebook,mobile-safari,Facebook,Mobile Safari,我有一个集成了Facebook登录的本机iOS应用程序。当安装本机Facebook应用程序时,登录流工作 但是,当我删除该应用程序时,FB登录会在FB Mobile Safari webapp上回退。应用程序切换工作正常,但当控件返回到我的应用程序时,会话状态声明为FBSessionStateClosedLoginFailed 截至2013年6月6日,我正在使用Facebook SDK v3.5.2 使用iPad1 iOS5.1.1 /* * Opens a Facebook
/*
* Opens a Facebook session and optionally shows the login UX.
*/
- (BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI {
NSArray *permissions = [[NSArray alloc] initWithObjects:
@"email",
@"publish_actions",
nil];
BOOL result = NO;
FBSession *session =
[[FBSession alloc] initWithAppID:nil
permissions:permissions
urlSchemeSuffix:@"<MySchemeSuffix>"
tokenCacheStrategy:nil];
if (allowLoginUI ||
(session.state == FBSessionStateCreatedTokenLoaded)) {
[FBSession setActiveSession:session];
[session openWithBehavior:FBSessionLoginBehaviorWithFallbackToWebView
completionHandler:
^(FBSession *session, FBSessionState state, NSError *error)
{
[self sessionStateChanged:session state:state error:error];
}];
result = session.isOpen;
}
return result;
}
/*
* If we have a valid session at the time of openURL call, we handle
* Facebook transitions by passing the url argument to handleOpenURL
*/
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
// attempt to extract a token from the url
//return [FBSession.activeSession handleOpenURL:url];
BOOL urlWasHandled = [FBAppCall handleOpenURL:url
sourceApplication:sourceApplication
fallbackHandler:^(FBAppCall *call) {
// handle deep links and responses for Login or Share Dialog here
}];
return urlWasHandled;
}
/*
* Callback for session changes.
*/
- (void)sessionStateChanged:(FBSession *)session
state:(FBSessionState) state
error:(NSError *)error
{
switch (state) {
case FBSessionStateOpen:
if (!error) {
if (FBSession.activeSession.isOpen) {
[[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
//Application specific code goes here.
}
}];
}
// We have a valid session
NSLog(@"User session found");
}
break;
case FBSessionStateClosed:
case FBSessionStateClosedLoginFailed:
[FBSession.activeSession closeAndClearTokenInformation];
break;
default:
break;
}
}
/*
*打开Facebook会话并显示登录用户体验(可选)。
*/
-(BOOL)openSessionWithAllowLoginUI:(BOOL)allowLoginUI{
NSArray*权限=[[NSArray alloc]initWithObjects:
@“电子邮件”,
@“发布行动”,
零];
BOOL结果=否;
FBSession*会话=
[[FBSession alloc]initWithAppID:nil
权限:权限
urlSchemeSuffix:@“”
策略:无];
if(allowLoginUI)||
(session.state==FBSessionStateCreatedTokenLoaded)){
[FBSession setActiveSession:会话];
[session openWithBehavior:FBSessionLoginBehavior WithFallbackTowView
completionHandler:
^(FBSession*会话,FBSessionState状态,N错误*错误)
{
[自会话状态已更改:会话状态:状态错误:错误];
}];
结果=session.isOpen;
}
返回结果;
}
/*
*如果我们在调用openURL时有一个有效的会话,我们将处理
*Facebook通过将url参数传递给handleOpenURL进行转换
*/
-(BOOL)应用程序:(UIApplication*)应用程序
openURL:(NSURL*)url
sourceApplication:(NSString*)sourceApplication
注释:(id)注释{
//尝试从url提取令牌
//返回[FBSession.activeSession handleOpenURL:url];
BOOL urlWashHandled=[FBAppCall handleOpenURL:url
sourceApplication:sourceApplication
后备处理程序:^(FBAppCall*call){
//在此处处理登录或共享对话框的深层链接和响应
}];
返回已处理的文件;
}
/*
*会话更改的回调。
*/
-(无效)会话状态已更改:(FBSession*)会话
状态:(FBSessionState)状态
错误:(n错误*)错误
{
开关(状态){
案例FBSessionStateOpen:
如果(!错误){
if(FBSession.activeSession.isOpen){
[[FBRequest requestForMe]startWithCompletionHandler:^(FBRequestConnection*连接,NSDictionary*用户,NSError*错误){
//特定于应用程序的代码在这里。
}
}];
}
//我们有一个有效的会话
NSLog(@“找到用户会话”);
}
打破
案件审理结束:
案例FBSessionStateClosedLogin失败:
[FBSession.activeSession closeAndClearTokenInformation];
打破
违约:
打破
}
}
我碰巧解决了这个问题
错误是,我在同一个调用中请求读取和写入权限。
从权限中删除“发布操作”解决了该问题
我通过本机FB登录、本机FB应用和webapp在iOS6+中测试了Facebook登录。
还通过本机FB应用程序和webapp在iOS5.1.1上进行了测试