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"];

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 с блоком завершения?

Другие вопросы по тегам