0

我有一个 AFHTTPClient 的子类,实现了 NSCoding 协议方法:

- (id)initWithCoder:(NSCoder *)aDecoder {

  self = [super initWithCoder:aDecoder];

  if (!self)
    return nil;

  self.isLoggedIn = [aDecoder decodeBoolForKey:@"isLoggedIn"];

  return self;
}

- (void)encodeWithCoder:(NSCoder *)aCoder {
  [super encodeWithCoder:aCoder];
  [aCoder encodeBool:self.isLoggedIn forKey:@"isLoggedIn"];
}

我还实现了为令牌设置默认标头的方法,并在那里存档了客户端:

- (void)setAuthorizationHeaderWithToken:(NSString *)token {
  [self setDefaultHeader:@"Authorization" value:[NSString stringWithFormat:@"OAuth %@", token]];

  [self setIsLoggedIn:YES];

  NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self];
  [[NSUserDefaults standardUserDefaults] setObject:data forKey:kGCClient];
  [[NSUserDefaults standardUserDefaults] synchronize];
}

- (id)initWithBaseURL:(NSURL *)url在子类的实现中反序列化客户端:

- (id)initWithBaseURL:(NSURL *)url {

  NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:kGCClient];
  GCClient *client = [NSKeyedUnarchiver unarchiveObjectWithData:data];

  if (client)
    return self = client;

  self = [super initWithBaseURL:url];

  if (!self) {
    return nil;
  }

  [self setIsLoggedIn:NO];

  return self;
}

问题是,一旦我登录,下次我打开应用程序时,它会在AFHTTPClient- (id)initWithCoder:(NSCoder *)aDecoder方法中崩溃客户端的反序列化,在第一次尝试解码对象时,在调试器中它说返回的值是不是 Objective-C 对象。

NSURL *baseURL = [aDecoder decodeObjectForKey:@"baseURL"];
4

1 回答 1

1

两件事情:

  • 使用 Keychain 而不是NSUserDefaults来存储凭据。
  • 而不是弄乱NSCoding, 只需覆盖-initWithBaseURL, (当然要确保调用super),并Authorization根据存储在钥匙串中的值(如果存在)设置标题。该isLoggedIn属性可以(并且应该)定义为派生readonly属性,YESAuthorization标头存在时返回,NO否则返回。
于 2013-05-26T18:01:21.510 回答