2011-03-02 80 views
0

下面是我登錄時使用的一些代碼,但是如何將keychain中的信息刪除?如何刪除登錄信息的keyChain信息?

+ (User *)currentUserForSite:(NSURL *)aSiteURL { 
    User *user = [[[self alloc] init] autorelease]; 
    user.siteURL = aSiteURL; 
    [user loadCredentialsFromKeychain]; 
    return user; 
} 

- (BOOL)hasCredentials {  
    return (self.login != nil && self.password != nil); 
} 

- (BOOL)authenticate:(NSError **)error { 
    if (![self hasCredentials]) { 
     return NO; 
    } 

    Session *session = [[[Session alloc] init] autorelease]; 
    session.login = self.login; 
    session.password = self.password; 

    return [session createRemoteWithResponse:error]; 
} 

- (void)saveCredentialsToKeychain { 
    NSURLCredential *credentials = 
    [NSURLCredential credentialWithUser:self.login 
           password:self.password 
          persistence:NSURLCredentialPersistencePermanent]; 

    [[NSURLCredentialStorage sharedCredentialStorage] 
    setCredential:credentials forProtectionSpace:[self protectionSpace]]; 
} 

#pragma mark - 
#pragma mark Key-value observing 

- (void)addObserver:(id)observer { 
    [self addObserver:observer forKeyPath:kUserLoginKey options:NSKeyValueObservingOptionNew context:nil]; 
    [self addObserver:observer forKeyPath:kUserPasswordKey options:NSKeyValueObservingOptionNew context:nil]; 
} 

- (void)removeObserver:(id)observer { 
    [self removeObserver:observer forKeyPath:kUserLoginKey]; 
    [self removeObserver:observer forKeyPath:kUserPasswordKey]; 
} 

#pragma mark - 
#pragma mark Private methods 

- (void)loadCredentialsFromKeychain { 
    NSDictionary *credentialInfo = 
    [[NSURLCredentialStorage sharedCredentialStorage] 
    credentialsForProtectionSpace:[self protectionSpace]]; 

    // Assumes there's only one set of credentials, and since we 
    // don't have the username key in hand, we pull the first key. 
    NSArray *keys = [credentialInfo allKeys]; 
    if ([keys count] > 0) { 
     NSString *userNameKey = [[credentialInfo allKeys] objectAtIndex:0]; 
     NSURLCredential *credential = [credentialInfo valueForKey:userNameKey]; 
     self.login = credential.user; 
     self.password = credential.password; 
    } 
} 

- (NSURLProtectionSpace *)protectionSpace { 
    return [[[NSURLProtectionSpace alloc] initWithHost:[siteURL host] 
                port:[[siteURL port] intValue] 
               protocol:[siteURL scheme] 
               realm:@"Web Password" 
            authenticationMethod:NSURLAuthenticationMethodDefault] autorelease]; 
} 
+0

此外ASIHTTPRequest庫有非常好的代碼來處理這個問題,所以你可以把它從那裏撕掉。 – Tony 2011-08-04 19:59:26

回答

2

我不是專家,但我不認爲你可以刪除憑藉NSURLCredentialPersistencePermanent存儲的憑證。我只想更新憑據爲空字符串 - @「」