2013-08-06 36 views
0

我为Instagram创建了一个AFHTTPClient类,并且我想将访问令牌保存在iOS钥匙串中,这样我就不必在每次应用程序启动时进行身份验证。但是我只能验证和保存的accessToken我已经在这里一次登录后是我的代码:使用AFHttpClient进行身份验证的问题

#define kAccessTokenInstagram @"Token" 
#define INSTAGRAM_AUTH_URL_FORMAT @"https://instagram.com/oauth/authorize/?client_id=%@&redirect_uri=%@&response_type=token" 

#import "InstagramClient.h" 
#import "Lockbox.h" 

@interface InstagramClient() 
@property (nonatomic, copy) NSString *accessToken; 
@end 

@implementation InstagramClient 

+ (instancetype)sharedClient { 
    static InstagramClient *_sharedClient = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     NSURL *baseURL = [NSURL URLWithString:@"https://api.instagram.com/v1/"]; 
     _sharedClient = [[InstagramClient alloc] initWithBaseURL:baseURL]; 
    }); 

    return _sharedClient; 
} 

- (id)initWithBaseURL:(NSURL *)url { 
    self = [super initWithBaseURL:url]; 
    if (self) { 
     [self registerHTTPOperationClass:[AFJSONRequestOperation class]]; 
     [self setDefaultHeader:@"Accept" value:@"application/json"]; 
    } 
    return self; 
} 

- (void)authenticateWithClientID:(NSString *)clientId callbackURL:(NSString *)callbackUrl { 
    NSString *urlString = [NSString stringWithFormat:INSTAGRAM_AUTH_URL_FORMAT, clientId, callbackUrl]; 
    NSURL *url = [NSURL URLWithString:urlString]; 
    [[UIApplication sharedApplication] openURL:url]; 
} 

- (void)handleOAuthCallbackWithURL:(NSURL *)url { 
    NSError *regexError = nil; 
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[^#]*#access_token=(.*)$" 
                      options:0 
                      error:&regexError]; 
    NSString *input = [url description]; 
    [regex enumerateMatchesInString:input 
          options:0 
           range:NSMakeRange(0, [input length]) 
         usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
          if ([result numberOfRanges] > 1) { 
           NSRange accessTokenRange = [result rangeAtIndex:1]; 
           self.accessToken = [input substringWithRange:accessTokenRange]; 
           NSLog(@"Access Token: %@", self.accessToken); 
           NSString *token = self.accessToken; 
           [Lockbox setString:token forKey:kAccessTokenInstagram]; 
          } 
         }]; 

} 

- (NSString *)accessToken { 
    return [Lockbox stringForKey:kAccessTokenInstagram]; 
} 

-(AFHTTPRequestOperation *)HTTPRequestOperationWithRequest:(NSURLRequest *)urlRequest success:(void (^)(AFHTTPRequestOperation *, id))success failure:(void (^)(AFHTTPRequestOperation *, NSError *))failure { 
    NSMutableURLRequest *request = [urlRequest mutableCopy]; 
    NSString *separator = [request.URL query] ? @"&" : @"?"; 
    NSString *newURLString = [NSString stringWithFormat:@"%@%@access_token=%@", [request.URL absoluteString], separator, self.accessToken]; 
    NSURL *newURL = [[NSURL alloc] initWithString:newURLString]; 
    [request setURL:newURL]; 
    return [super HTTPRequestOperationWithRequest:request success:success failure:failure]; 

} 

@end 

这是导致我发出的代码...:

- (NSString *)accessToken { 
    return [Lockbox stringForKey:kAccessTokenInstagram]; 
} 

回答

1

对于@property (nonatomic, copy) NSString *accessToken;你已经定义了一个getter方法,只有在已设置钥匙链的情况下才从钥匙串中取回标记。第一次运行代码时会出现问题,因为您在设置之前尝试访问accessToken属性的getter:[Lockbox setString:token forKey:kAccessTokenInstagram];

在设置它之前,您无法使用self.accessToken你的街区发生了什么事。

也许尝试:

NSRange accessTokenRange = [result rangeAtIndex:1]; 
NSString *token = [input substringWithRange:accessTokenRange]; 
NSLog(@"Access Token: %@", token); 
[Lockbox setString:token forKey:kAccessTokenInstagram]; 

代替:

NSRange accessTokenRange = [result rangeAtIndex:1]; 
self.accessToken = [input substringWithRange:accessTokenRange]; 
NSLog(@"Access Token: %@", self.accessToken); 
[Lockbox setString:token forKey:kAccessTokenInstagram]; 
+0

你能告诉我怎么解决这个问题 – Prad

+0

只是一个可能的修复编辑 –

相关问题