AFNetworking с управлением сессиями iOS

Мне нужно сначала войти в систему, используя эту функцию, а затем я хотел бы, например. вызовите функцию, которая показывает заказы, в зависимости от user_id, сохраненного во время входа в систему в переменной $_SESSION на сервере с использованием php.

Может ли кто-нибудь помочь мне получить этот набор? Вход в систему работает безупречно, но кажется, что AFNetworking прерывает сеанс и не сохраняет его.

Заранее спасибо.

NSURL *baseURL = [NSURL URLWithString:@"https://example.com/robot/"]; NSDictionary *parameters = @{@"eMail": eMail.text, @"pass" : password.text };

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];



AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:sessionConfiguration];
[manager initWithBaseURL:baseURL];



manager.responseSerializer = [AFJSONResponseSerializer serializer];


[manager POST:@"iPad.php?action=Login" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
    NSDictionary *json = responseObject;


    NSString *jsonstatus;
    jsonstatus = [json objectForKey:@"status"];


    if ([jsonstatus isEqualToString:@"100"]){
        NSLog(@"logged in");

}

NSURL *baseURL = [NSURL URLWithString:@"https://example.com/robot/"]; NSDictionary *parameters = @{@"query": @"" };

NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration];



AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:sessionConfiguration];
[manager initWithBaseURL:baseURL];


manager.responseSerializer = [AFJSONResponseSerializer serializer];


[manager POST:@"iPad.php?action=ShowOrders" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
    NSLog(@"hi");
    NSDictionary *json = responseObject;


    NSString *jsonstatus;
    jsonstatus = [json objectForKey:@"status"];

person Jimmy Tschonga    schedule 21.03.2014    source источник
comment
В чем именно проблема или ошибка, с которой вы столкнулись? Ваш код делает запрос POST для входа в систему. У вас есть дополнительный код, который отправляет запрос GET для данных заказа?   -  person Paulw11    schedule 22.03.2014
comment
Да, у меня есть дополнительная функция, а именно:   -  person Jimmy Tschonga    schedule 22.03.2014
comment
Вы можете отредактировать свой вопрос, чтобы добавить дополнительный код. Также любое сообщение об ошибке, которое вы получаете   -  person Paulw11    schedule 22.03.2014
comment
Функция вызывается, но если я заставлю сервер отображать session_id(), она изменится. Поэтому функция showOrders не работает и не возвращает никаких значений. Но функции PHP работают, так как они также используются на веб-сайте и запускаются функциями javascript.   -  person Jimmy Tschonga    schedule 22.03.2014
comment
Xcode не выдает никаких ошибок. Просто не возвращаются значения, поскольку SESSION не сохраняется.   -  person Jimmy Tschonga    schedule 22.03.2014


Ответы (1)


Ваша проблема вызвана созданием нового объекта AFHTTPSessionManager во втором блоке кода. Вы должны создать один AFHTTPSessionManager для своего приложения и инициализировать baseURL. Затем вы можете выполнить ряд транзакций против одного и того же менеджера.

Ваш второй блок кода должен быть просто

[manager POST:@"iPad.php?action=ShowOrders" parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject) {
NSLog(@"hi");
NSDictionary *json = responseObject;


NSString *jsonstatus;
jsonstatus = [json objectForKey:@"status"];

ОБНОВИТЬ

В вашей инициализации AFHTTPSessionManager есть еще одна проблема, которую вы должны решить.

Сначала вы звоните

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:sessionConfiguration];

тогда ты звонишь

[manager initWithBaseURL:baseURL];

Этот второй вызов повторно инициализирует ваш диспетчер сеансов без конфигурации сеанса. Вы должны вызвать комбинированный инициализатор следующим образом:

AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithBaeURL:baseURL sessionConfiguration:sessionConfiguration];

Я также провел небольшой тест на сервере PHP, и неправильная конфигурация не помешала правильной работе сеанса, однако то, что воспроизвело вашу проблему, заключалось в том, что запросы выполнялись слишком быстро. Вы должны убедиться, что ваш запрос на вход выполнен, прежде чем вы выдадите следующий запрос, иначе второй запрос будет выполнен в новом сеансе, поскольку AFHTTPSession не сериализует запросы — они выполняются асинхронно. Как вы гарантируете, что задача входа в систему завершена до того, как вы отправите запрос showOrders?

Вы можете использовать очередь запросов, чтобы убедиться, что они работают последовательно — см. этот ответ — AFNetwork 2.0 Очередь с блоком завершения?

person Paulw11    schedule 21.03.2014
comment
Итак, если у меня есть разные представления для вызова функций; как я могу реализовать менеджера в делегате приложения и сделать его доступным для всех представлений? Как я могу назвать это тогда? Спасибо - person Jimmy Tschonga; 22.03.2014
comment
Разве это не должно работать примерно так: viewManager = [(AppDelegate *)[UIApplication sharedApplication].delegate manager]; - person Jimmy Tschonga; 22.03.2014
comment
Да, свойство в appDelegate, вероятно, самый простой подход. - person Paulw11; 22.03.2014
comment
Я включил следующий код в AppDelegate.h - person Jimmy Tschonga; 22.03.2014
comment
NSURL *baseURL = [NSURL URLWithString:@xxx.com/robot/]; NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; AFHTTPSessionManager *manager = [[AFHTTPSessionManager alloc] initWithSessionConfiguration:sessionConfiguration]; [менеджер initWithBaseURL:baseURL]; manager.responseSerializer = [сериализатор AFJSONResponseSerializer]; - person Jimmy Tschonga; 22.03.2014
comment
Подскажите, пожалуйста, как обратиться к менеджеру внутри Views? - person Jimmy Tschonga; 22.03.2014
comment
Ваш AFHTTPSessionManager по-прежнему является локальной переменной. Вам нужно сделать его свойством вашего AppDelegate и назначить его с помощью self.manager . Затем вы можете сослаться на него в соответствии с вашим предыдущим комментарием. - person Paulw11; 22.03.2014
comment
Я добавил в AppDelegate.h следующее: @property (strong, nonatomic) AFHTTPSessionManager *manager; Теперь я могу обратиться к нему, но, к сожалению, функция все еще не работает. - person Jimmy Tschonga; 22.03.2014
comment
Вам необходимо убедиться, что класс AFHTTPSessionManager хранит файлы cookie, необходимые вашему приложению для соблюдения входа в систему. Иногда метод входа в систему возвращает ключ сеанса, который вам необходимо указать при последующих вызовах — вам нужно будет ознакомиться с документацией веб-сервиса. - person Paulw11; 22.03.2014
comment
На самом деле это не должно быть необходимо. Я просто обновляю существующее приложение с ASIHttpRequest на AFNetworking. В ASI вы могли просто установить сеанс/соединение как постоянное, и это сработало отлично. Прямо сейчас вход в систему вообще не работает, если я попытаюсь инициировать его в делегате приложения и просто вызову [delegate.manager POST:@iPad.php?action=Параметры входа: параметры успеха:^(NSURLSessionDataTask *task, id responseObject)... функция в представлении. - person Jimmy Tschonga; 22.03.2014
comment
Так почему же вы переходите от работающего фреймворка к неработающему? - person Paulw11; 22.03.2014