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 за вашето приложение и да инициализирате основния URL адрес. След това можете да изпълните няколко транзакции срещу един и същ мениджър.

Вашият втори блок от код просто трябва да бъде

[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 (силен, неатомичен) AFHTTPSessionManager *manager; Сега мога да се позова на него, но за съжаление функцията все още не работи. - person Jimmy Tschonga; 22.03.2014
comment
Трябва да се уверите, че класът AFHTTPSessionManager пази бисквитките, които вашето приложение изисква, за да спазва влизането. Понякога методът за влизане ще върне сесиен ключ, който трябва да предоставите при следващи повиквания - ще трябва да се консултирате с документацията на уеб услугата - person Paulw11; 22.03.2014
comment
Всъщност това не би трябвало да е необходимо. Просто актуализирам съществуващо приложение от ASIHttpRequest към AFNetworking. В рамките на ASI можете просто да настроите сесията/връзката на постоянна и тя работи перфектно. В момента влизането изобщо не работи, ако се опитам да го инициирам в делегата на приложението и просто извикам [delegate.manager POST:@iPad.php?action=Login parameters:parameters success:^(NSURLSessionDataTask *task, id responseObject)... функция в изгледа. - person Jimmy Tschonga; 22.03.2014
comment
Така че защо преминавате от рамка, която работи, към такава, която не работи? - person Paulw11; 22.03.2014