我有一个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"];
答案 0 :(得分:1)
两件事:
NSUserDefaults
来存储凭据。NSCoding
,只需覆盖-initWithBaseURL
,(当然确保调用super
),并根据存储的值设置Authorization
标头在钥匙串中(如果存在)。 isLoggedIn
属性可以(并且应该)定义为派生readonly
属性,当YES
标头存在时返回Authorization
,否则返回NO
。