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