Правильный поток для входа пользователя из приложения iOS в удаленный API


Вот логический поток, который я пытаюсь закодировать в своем приложении для iPhone:

Введите описание изображения здесь

Я думаю, что понимаю технические особенности для достижения этой цели (использование AFNetworking, подключение к Rails API с использованием Devise в качестве аутентификации). Auth_token будет сохранен в связке ключей после успешного входа в систему. Я не могу понять, как лучше всего настроить мое приложение, чтобы оно вело себя так, как описано выше.

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

Как бы я добился этого? Я не знаю, какой контроллер вида я должен установить в качестве rootviewcontroller в AppDelegate или как я должен установить его после того, как пользователь вошел в систему. Я пробовал это в приложении Facebook, и когда я открываю его, я вижу пустой навигационный контроллер, кажется, тогда мой профиль загружен. Что они делают за кулисами и является ли это лучшим способом идти?

Я не использую раскадровки.

3 11

3 ответа:

Я реализовал похожий, RootViewController был "SplashViewController" в navigationController, показывая красивый логотип, индикатор активности и дает пользователю информацию о состоянии аутентификации. Он содержит логику для проверки сохраненного там токена и реализации аутентификации. Если аутентификация прошла успешно, ShowUserController отображается путем нажатия на стек navigationController.

Если аутентификация является ошибкой, то LoginViewController представлен модально. SplashViewController реализует делегат LoginViewController, который ничего не делает, кроме передачи имени пользователя и пароля SplashViewController. При успешном входе в систему LoginViewController отключается, и пользователь направляется к ShowUserController.

Запустите приложение с корневым контроллером, как тот, который пользователь увидит после успешного входа в систему, затем наложите представления входа/контроллеры сверху с модальными вызовами. Если аутентификация прошла успешно, ваш пользователь уже будет там, где он хочет быть, иначе вы вызовете слои входа модально сверху. Как только они будут аутентифицированы, вам больше не понадобятся представления входа.

Чтобы подробнее рассказать об ответе @Owen Hartnett, поскольку этот текст не поместится в комментарии; Вот как я видел работу SDK Facebook. Если вы создаете приложение, которое использует Facebook iOS SDK в качестве единственного механизма входа в систему, то он работает следующим образом:

В методе делегата моего приложения didFinishLaunchingWithOptions я сначала проверяю наличие маркера доступа "уже в файле", скажем, NSUserDefaults. Если не найден, мне нужно получить его, и поэтому мой делегат приложения немедленно запускает модальный поток входа, который заканчивается допустимым маркером доступа это затем сохраняется в NSUserDefaults для использования при следующем открытии приложения.

Если у меня уже есть маркер доступа в файле в моем didFinishLaunchingWithOptions, то я предполагаю счастливый путь и открываю" сеанс пользователя, вошедшего в систему " асинхронно, используя маркер доступа, который я нашел в файле во время открытия приложения. Если маркер доступа, который у меня есть в файле, чтобы открыть сеанс, является законным, то UX не отображается. Если маркер доступа, который у меня есть в файле, является нелегитимным (сервер говорит, что он слишком старый, например), то мой метод open session в мой делегат приложения, узнав об этом, отобразит правильный модальный поток входа.

Поскольку этот метод openSession выполняется асинхронно,вам может быть интересно, как будет функционировать ваш корневой контроллер представления, который нуждается в зарегистрированном пользователе.

Ответ заключается в том, что он должен быть написан так, как если бы в нем был зарегистрирован пользователь. Это надо предполагать. Если он когда-либо запускает код, который не может выполнить или завершить выполнение успешно, потому что у него нет допустимого маркера доступа, то этот код должен вызвать пользовательский интерфейс входа , если он еще не представлен (то есть проверка маркера доступа на app open к этому времени уже представила пользователю модальный пользовательский интерфейс входа).

Наконец, это переведенная версия потока входа в Facebook SDK. Например, если вы используете только их SDK, вы никогда не будете взаимодействовать с NSUserDefaults, Как я предлагаю. Я перевел их поток в "пользовательскую реализацию" входа в удаленный API.