FaceBook API, вход в приложение

Я следовал этому руководству и успешно создал свое приложение с интеграцией с Facebook.

В чем проблема?

Когда пользователю необходимо войти в систему, приложение закрывается в браузере (или в приложении Facebook, если оно установлено).

Как сохранить аутентификацию полностью в приложении?


person JAA    schedule 06.08.2011    source источник


Ответы (2)


Смысл входа в систему oAuth заключается в том, что это не происходит в вашем приложении. Он использует быстрое переключение приложений для выполнения аутентификации в доверенной среде (либо в Safari, либо в приложении Facebook).

Однако вы можете изменить Facebook.m для аутентификации в вашем приложении, но ваши учетные данные пользователя не будут запомнены. Вы можете видеть, что если ваше устройство iOS не поддерживает многозадачность, есть резервное диалоговое окно входа в систему.

Выдержка из Facebook.m (около строки 160):

if ([device respondsToSelector:@selector(isMultitaskingSupported)] && [device isMultitaskingSupported]) {
    if (tryFBAppAuth) {
      NSString *scheme = kFBAppAuthURLScheme;
      if (_localAppId) {
        scheme = [scheme stringByAppendingString:@"2"];
      }
      NSString *urlPrefix = [NSString stringWithFormat:@"%@://%@", scheme, kFBAppAuthURLPath];
      NSString *fbAppUrl = [FBRequest serializeURL:urlPrefix params:params];
      didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]];
    }

    if (trySafariAuth && !didOpenOtherApp) {
      NSString *nextUrl = [self getOwnBaseUrl];
      [params setValue:nextUrl forKey:@"redirect_uri"];

      NSString *fbAppUrl = [FBRequest serializeURL:loginDialogURL params:params];
      didOpenOtherApp = [[UIApplication sharedApplication] openURL:[NSURL URLWithString:fbAppUrl]];
    }
}

// If single sign-on failed, open an inline login dialog. This will require the user to
// enter his or her credentials
if (!didOpenOtherApp) {
    [_loginDialog release];
    _loginDialog = [[FBLoginDialog alloc] initWithURL:loginDialogURL
                                      loginParams:params
                                         delegate:self];
    [_loginDialog show];
}

Если вы удалите первое условное выражение, содержащее код, и установите для didOpenOtherApp значение NO, вы можете получить поведение, которое вы ищете.

person dtuckernet    schedule 07.08.2011
comment
Это немного проще (хотя, когда вы отвечали, все могло быть по-другому). - person bentford; 04.11.2011

Чтобы отключить это поведение, измените строку 275 Facebook.m и установите для обоих параметров значение НЕТ.

- (void)authorize:(NSArray *)permissions {
  self.permissions = permissions;

  // with both options NO, authorization always happens in-app
  [self authorizeWithFBAppAuth:NO safariAuth:NO];
}
person bentford    schedule 03.11.2011