AFNetworking + cocoapods +用户会话到期监控

时间:2014-05-16 12:58:03

标签: ios objective-c cookies afnetworking

我有一个客户端 - 服务器应用程序,其中包含一个服务器单例,它是使用cocoapods安装的AFHTTPSessionManager的子类。当用户登录时,他们会存储会话cookie,并且他们可以执行需要活动会话的不同操作,而不会在会话处于活动状态时多次提供其凭据。我有大约50多个服务器调用,需要用户进行身份验证,并且可以返回JSON响应,指出用户的会话不再有效并且需要刷新 - 通过此事件我应该将用户退出登录屏幕并要求他们重新登录。我知道在AFNetworking核心的某个地方有一个方法可以处理所有GET和POST方法的原始响应,然后再将它们转换为responseObject类型的id但我不能使用它,因为我使用cocoapods并且无法真正修改pod的核心(我使用git和pods并未包括在提交中)。问题是 - 如何集中处理用户会话到期事件,而不是在50多个不同的方法调用中重复它?

1 个答案:

答案 0 :(得分:0)

我不知道这是否是最好的方法,但是我已经通过创建一个统一的方法解析服务器的错误响应来解决这个问题,并检查用户是否经过身份验证,如下所示并发布当用户通过app中的注销按钮注销时发布的NSNotification:

// in context of creating a request
success:^(NSURLSessionDataTask *task, id responseObject) {
            NSString *errors = [self errors:responseObject[@"errors"]];
           }

- (NSString *)errors:(id)errors
{
  NSString *errMsg = nil;
  if ([errors isKindOfClass:[NSDictionary class]]) {
    errMsg = @"";
    for (NSString *key in errors) {
      errMsg = [errMsg stringByAppendingFormat:@"%@: ", key];
      errMsg = [errMsg stringByAppendingString:[[errors objectForKey:key] componentsJoinedByString:@" "]];
      errMsg = [errMsg stringByAppendingString:@"\n"];
    }
  }
  else if ([errors isKindOfClass:[NSError class]]) {
    if (!self.reachabilityManager.reachable) {
      errMsg = @"Host isn't reachable. Please make sure you have an active Internet connection and try again later.";
    }
    else {
      errMsg = [errors localizedDescription];
    }
  }
  else if ([errors isKindOfClass:[NSString class]]) {
    if ([errors isEqualToString:@"Operation requires authorized access."]) {
      [CPAlertManager showMessage:@"Please re-authenticate." withTitle:@"Session expired."];
      [[NSNotificationCenter defaultCenter] postNotificationName:CPUserLoginStatusChanged
                                                          object:@{ @"CPUserLoginStatus" : @(CPUserLoginStatusLoggedOut) }];
    }
    else {
      errMsg = errors;
    }
  }
  return errMsg;
}