iOS本机Facebook登录无法进行Mobile Safari身份验证

iOS本机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

我有一个集成了Facebook登录的本机iOS应用程序。当安装本机Facebook应用程序时,登录流工作

但是,当我删除该应用程序时,FB登录会在FB Mobile Safari webapp上回退。应用程序切换工作正常,但当控件返回到我的应用程序时,会话状态声明为FBSessionStateClosedLoginFailed

截至2013年6月6日,我正在使用Facebook SDK v3.5.2 使用iPad1 iOS5.1.1

    /*
     * 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上进行了测试