Приложение за iOS: Удостоверяване с изчакване на сървъра след 20 минути. Това нормално ли е и как да се справя?

Какво правя

Създавам корпоративно приложение с набор от частни API, които ми бяха предоставени. За съжаление, след 20 минути бездействие, получавам 401 неоторизирани отговора от последващи обаждания към сървъра, докато не изляза от приложението и не вляза отново (или по-конкретно, докато не извикам отново API за влизане с потребителско име и парола).


Това, което съм пробвал

  • Извикване на API за влизане на всеки около 10 минути. Това изглежда работи, но е грозно и не изглежда толкова надеждно (все още получаваме доклади за 401 грешки от бета тестери).

  • За всяка уеб заявка, която правя, мога да проверя за 401, след което да обработя по подходящ начин и да преправя същата заявка. Работи добре, но е грозен, има много дублиран код (копирайте и поставете за всеки манипулатор на заявки...) и като цяло просто лош стил.

  • Използване на делегиран метод на манипулатора на предизвикателство на ниво сесия на NSURLSession. Това получава предизвикателство при първоначалното извикване на API за влизане от тип NSURLAuthenticationMethodServerTrust, на което отговарям с идентификационни данни, създадени от challenge.protectionSpace.serverTrust. Това предизвикателство е успешно и приложението продължава добре. След 20 минути неактивност следващото направено API извикване ще задейства отново този метод на делегиране. Отговарям по същия начин и методът се извиква само веднъж, без challenge.previousFailureCount или нещо подобно, така че всичко изглежда наред... но заявката връща 401.

  • Използване на делегиран метод на манипулатора на предизвикателство на ниво задача на NSURLSession. Това се извиква по-често от делегата на ниво сесия, но дава същия резултат. Отначало добре, но след 20 минути неактивност отговарям на него по същия начин и 401 се връща без предупреждение, като например извикан манипулатор на предизвикателство с previousFailureCount по-голям от 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