ios - AFNetworking 与 session 管理 iOS

标签 ios ios7 afnetworking-2

我需要的是首先使用此功能登录,而不是我想要的,例如调用显示订单的函数,具体取决于使用 php 在服务器上的 $_SESSION 变量中登录期间存储的 user_id。

谁能帮我搞定这一套?登录工作完美无缺,但 AFNetworking 似乎放弃了 session 并且没有保留它。

提前致谢。

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

最佳答案

您的问题是由在第二个代码块中创建新的 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];

第二次调用将在没有 session 配置的情况下重新初始化您的 session 管理器。你应该像这样调用组合初始化程序 -

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

我还在 PHP 服务器上设置了一个小测试,不正确的配置并没有阻止 session 正常运行,但是重现您的问题的原因是允许请求完成得太快。您需要确保在发出下一个请求之前您的登录请求已完成,否则第二个请求将在新 session 中发生,因为 AFHTTPSession 不会序列化请求 - 它们是异步执行的。在发出 showOrders 请求之前,您如何确保登录任务已完成?

您可以使用请求队列来确保它们按顺序运行 - 请参阅此答案 - AFNetwork 2.0 Queue with completion block?

关于ios - AFNetworking 与 session 管理 iOS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22569457/

相关文章:

iphone - IOS 7 + 对于力 Controller 方向为纵向

ios - 轴线和轴标签之间的空间 ios MPChart

ios - 通过 watchConnectivity 发送一个 NSObject

ios - 在 objective-c 中翻转缩放和旋转的 uiview

ios - 带 POST 参数的 AFNetworking 上传任务

iOS AFNetworking 2.0 XML 网络服务

ios - 当应用程序有互联网连接时,将离线核心数据与服务器同步

ios - 当父 UIViewController 调整容器 View 的大小时, subview Controller 不会自动布局

ios - iOS 7 上的 UIBarButtonSystemItemRefresh

iOS后台服务振动电话