IPhone/iOS Facebook SDK - можете ли вы войти в приложение и сохранить учетные данные?

Можно ли использовать SDK для iOS для проверки подлинности в приложении (а не перейти в Safari), а также сохранить эти учетные данные для следующего запуска приложения?

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

Есть ли способ, чтобы просто представить пользователю только поле электронной почты и поле пароля, а затем сохранить эту информацию в приложении?

Ответ 1

Взгляните на этот вопрос и ответ: Iphone facebook connect example вызывает сафари. Я не хочу использовать сафари. Кроме того, вы захотите сохранить данные аутентификации в NSUserDefaults и проверить их, чтобы предотвратить повторные логины.

EDIT Пример кода:

Чтобы сохранить материалы для входа:

[[NSUserDefaults standardUserDefaults] setObject:_facebook.accessToken forKey:@"AccessToken"];
[[NSUserDefaults standardUserDefaults] setObject:_facebook.expirationDate forKey:@"ExpirationDate"];
[[NSUserDefaults standardUserDefaults] synchronize];

Чтобы проверить содержимое входа:

_facebook = [[[Facebook alloc] initWithAppId:@"[app_id]"] retain];
_facebook.accessToken    = [[NSUserDefaults standardUserDefaults] stringForKey:@"AccessToken"];
_facebook.expirationDate = (NSDate *) [[NSUserDefaults standardUserDefaults] objectForKey:@"ExpirationDate"];
if (![_facebook isSessionValid]) {
    [_facebook authorize:_permissions delegate:self];
}
else {
    [_facebook requestWithGraphPath:@"me" andDelegate:self];
}

Ответ 2

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

В facebook.m найдите следующий метод

- (void)authorizeWithFBAppAuth:(BOOL)tryFBAppAuth
                    safariAuth:(BOOL)trySafariAuth

найдите нижнюю часть логики didOpenOtherApp и закомментируйте все выше нее так, чтобы она всегда открывала строку и настраивала этот раздел кода, содержащийся в фигурных скобках! didOpenOtherApp

// 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];
  }

Однако, делая это, вы делаете более вероятным, что пользователь должен будет ввести свои учетные данные, что, безусловно, хуже, чем использовать быстрый подход к переключению приложений?

Ответ 3

Когда вы впервые авторизуетесь, убедитесь, что вы запрашиваете разрешение "offline_access". Это сделает маркер, который OAuth вернет вам. НЕ будет признан недействительным в конце сеанса, но вместо этого останется действительным буквально, пока они не придут и не используют API для регистрации вашего приложения вне Facebook.

Затем, очевидно, вам нужно сохранить токен (я чувствую, что NSUserDefaults - прекрасное место для него) и повторно использовать его при последующих взаимодействиях FB.