2010-03-02 45 views
1

我在iPhone Twitter應用程序中使用OAuth/xAuth,並且存在包含特殊字符的密碼問題。例如「密碼&」。首先,我轉換成& 26%這樣做:使用URL編碼字符串時iPhone上的OADataFetcher問題

NSString *encodedPassword = (NSString *)CFURLCreateStringByAddingPercentEscapes(
                       NULL, 
                       (CFStringRef)thePassword, 
                       NULL, 
                       (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
                       kCFStringEncodingUTF8); 

這個編碼它細到「密碼26%」。我然後將其設置爲OAMutableURLRequest的參數:

[request setParameters:[NSArray arrayWithObjects: 
         [OARequestParameter requestParameterWithName:@"x_auth_mode" value:@"client_auth"], 
         [OARequestParameter requestParameterWithName:@"x_auth_username" value:encodedUsername], 
         [OARequestParameter requestParameterWithName:@"x_auth_password" value:encodedPassword], 
         nil]]; 

在使用OADataFetcher發送請求,我收到一個NSUrlError:

Error Domain=NSURLErrorDomain Code=-1012 UserInfo=0x4823e00 "Operation could not be completed. (NSURLErrorDomain error -1012.)"

什麼我錯在這裏做什麼?如果我將密碼中的&離開,它會崩潰我的代碼(setParamaters陣列流失)。有沒有人在使用OAuth之前遇到過這個問題?

如果我有一個字母數字密碼,一切工作正常...感謝您的任何指導!

回答

0

OAuthRequestParameter已經編碼了名稱和值;可能是&特別是造成問題。你有沒有嘗試過使用不同的非標準字符?它可能需要修改OAuth庫本身。

0

問題是標準OAuth庫使用錯誤的stringByAddingPercentEscapesUsingEncoding來編碼用戶名和密碼。

我的解決辦法是使一個類別,覆蓋OARequestParameter以下方法

- (NSString *)URLEncodedName 
{ 
return [self.name stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
} 

- (NSString *)URLEncodedValue 
{ 
    return [self.value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
} 

即:

把下面的某個項目中的:

//the .h file 
#import "OARequestParameter.h" 

@interface OARequestParameter (YourApp) 

@end 

和覆蓋越野車方法:

#import "OARequestParameter+YourApp.h" 


@implementation OARequestParameter (YourApp) 

-(NSString*)encode:(NSString*)unencodedString 
{ 
NSString * encodedString = (NSString *)CFURLCreateStringByAddingPercentEscapes(
         NULL, 
         (CFStringRef)unencodedString, 
         NULL, 
         (CFStringRef)@"!*'();:@&=+$,/?%#[]", 
         kCFStringEncodingUTF8); 
return [encodedString autorelease]; 
} 

- (NSString *)URLEncodedName 
{ 
//return [self.name stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
return [self encode:self.name]; 
} 

- (NSString *)URLEncodedValue 
{ 
    //return [self.value stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]; 
return [self encode:self.value]; 
} 

@end