FBSDKLoginManager没有正确处理logInWithPublishPermissions:

时间:2015-05-06 16:57:36

标签: ios facebook-login facebook-ios-sdk

我正在实施适用于iOS的SDK的v4.1,当我尝试调用publishPermissions:时,我没有回调。

出于某种原因,当我运行logInWithReadPermissions:时,一切都运行良好,但是当我运行logInWithPublishPermissions时:它永远不会命中我的响应处理程序。什么都没发生。

为了测试一下,我在运行logInWithPublishPermissions:之前重置了我的loginManager,令我惊讶的是它工作了(又叫NSLog(@“RESULT”))。

我是否遗漏了有关loginManager如何工作的内容?我不能在没有重置的情况下使用它吗?

// FacebookController.m

@implementation FacebookController

FBSDKLoginManager *loginManager;
static FacebookController *_shared = nil;

- (id)init { 
    self = [super init];
    if (self != nil) {
        userData = [[NSMutableDictionary alloc] init];

        loginManager = [[FBSDKLoginManager alloc] init];
    }
    return self;
}

+ (id)getInstance { 
    if (!_shared) {
        _shared = [[self alloc] init];
    }
    return _shared;
}

- (bool)hasPublishPermissions {
    FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken];

    if(accessToken != NULL){
        NSSet *permissions = [accessToken permissions];
        if([permissions containsObject:@"publish_actions"]){
            return TRUE;
        }
    }
    return FALSE;
}

- (void)requestPublishPermissionsWithDelegate:(id)aDelegate {
    if(![self hasPublishPermissions]){
        // FOR SOME REASON IT WORKS IF I RESET LOGIN MANAGER AS FOLLOWS
        // loginManager = [[FBSDKLoginManager alloc] init]; 

        [loginManager logInWithPublishPermissions:@[@"publish_actions"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
            NSLog(@"RESULT: %@", result);
        }];
    }
}

- (void)connectToFacebookWithDelegate:(id)aDelegate {        
    FBSDKAccessToken *accessToken = [FBSDKAccessToken currentAccessToken];

    if(accessToken != nil){
        [aDelegate performSelector:@selector(facebookSignedIn)];
    } else {
        [loginManager logInWithReadPermissions:@[@"email"] handler:^(FBSDKLoginManagerLoginResult *result, NSError *error) {
            if (error) {
                // Process error
                NSLog(@"ERROR");
            } else if (result.isCancelled) {
                // Handle cancellations
                NSLog(@"CANCELLED");
            } else {
                NSLog(@"SUCCESS");
                [aDelegate performSelector:@selector(facebookSignedIn)];
            }
        }];
    }
}
@end

编辑#1: 包括有效的视频和不适用于特定场景的视频:

不工作(登录注册表重新初始化): https://dl.dropboxusercontent.com/u/14277258/not-working.mov

工作(loginManager重新初始化): https://dl.dropboxusercontent.com/u/14277258/working.mov

1 个答案:

答案 0 :(得分:1)

您的视频堆栈跟踪表明您在初始登录的处理程序中调用了发布权限请求。这应该避免:

  1. 在用户已经授予您一些权限后,您将再次进行登录 - 用户在完成后立即查看另一个登录对话框并不是很好。
  2. 当您不需要时,您会要求发布权限 - 这可能违反了Facebook开发者政策,并且不再是最佳用户体验。相反,您应该仅在需要时(即,在共享时)要求发布。
  3. 如果您真的坚持,可以异步发送第二次登录呼叫,以便第一次请求完全完成,但我不推荐。我们可能会更新SDK以检测它并记录,因此它不会令人困惑。