Приложение iOS: Аутентификация с истечением времени ожидания сервера через 20 минут. Это нормально и как с этим бороться?

Что я делаю

Я создаю корпоративное приложение с набором предоставленных мне частных API. К сожалению, после 20 минут бездействия я получаю 401 неавторизованный ответ от последующих обращений к серверу, пока я не выйду из приложения и не войду снова (или, точнее, пока я снова не вызову API входа с именем пользователя и паролем).


Что я пробовал

  • Вызов API входа каждые 10 минут или около того. Кажется, это работает, но это уродливо и не кажется надежным (все еще получаю отчеты об ошибках 401 от бета-тестеров).

  • Для каждого веб-запроса, который я делаю, я могу проверить 401, затем обработать его соответствующим образом и переделать тот же запрос. Он работает нормально, но некрасиво, много повторяющегося кода (копировать и вставлять для каждого обработчика запросов...) и в целом плохой стиль.

  • Использование метода делегата обработчика вызовов на уровне сеанса NSURLSession. Это получает вызов при начальном вызове API входа в систему типа NSURLAuthenticationMethodServerTrust, на который я отвечаю учетными данными, созданными из challenge.protectionSpace.serverTrust. Эта задача выполнена успешно, и приложение работает нормально. После 20 минут бездействия следующий вызов API снова вызовет этот метод делегата. Я отвечаю таким же образом, и метод вызывается только один раз, без вызова.previousFailureCount или чего-то еще, так что все вроде бы в порядке... но запрос возвращает 401.

  • Использование метода делегата обработчика вызова уровня задачи NSURLSession. Это вызывается чаще, чем делегат уровня сеанса, однако дает тот же результат. Сначала нормально, но после 20 минут бездействия я отвечаю на него таким же образом, и возвращается 401 без предупреждения, например, обработчик отозванного вызова с предыдущимFailureCount больше 0.

  • Вызов API входа из метода делегата обработчика вызовов на уровне задачи или сеанса. У этого есть несколько проблем: от делегата уровня сеанса у меня нет способа определить, вызывается ли вызов из самого API входа (в этом случае мы не хотели бы отзывать API входа) или из другого API (в этом случае мы хотели бы). Также нет возможности отозвать исходный NSURLRequest, который завершился неудачно. От делегата уровня задачи - это работает, потому что я могу приостановить задачу до тех пор, пока не произойдет повторная аутентификация, и вызывать API входа только тогда, когда запрос задачи не для API входа. НО - это слишком часто называют - например. он вызывается около 20 раз во время запуска приложения. Это довольно некрасиво и неэффективно.


Что я хотел бы знать

  • Что нормально? Является ли поведение сервера нормальным, и я что-то упустил в том, как я должен справляться с этим? Или - сервер ненормальный, и есть ли простое решение, которое я мог бы предложить клиенту?

  • Есть ли чистый способ справиться с такой настройкой аутентификации в iOS?

  • В моей ситуации, что бы вы сделали?


person Jordan Smith    schedule 17.12.2014    source источник


Ответы (1)


В моей ситуации, что бы вы сделали?

Почини чертов сервер, вот что. Или найдите человека, который может это исправить, и заставьте его исправить это. У вас есть множество обходных путей, но все они вращаются вокруг проблемы, которую можно решить раз и навсегда. Выясните, кто отвечает за сервер, и заставьте их починить его.

person Tom Harrington    schedule 17.12.2014