使用URL编码字符串时,iPhone上的OADataFetcher出现问题

使用URL编码字符串时,iPhone上的OADataFetcher出现问题,iphone,oauth,urlencode,Iphone,Oauth,Urlencode,我在iphonetwitter应用程序中使用OAuth/xAuth,密码中包含特殊字符时出现问题。例如密码&。首先,我通过执行以下操作将&转换为%26: NSString *encodedPassword = (NSString *)CFURLCreateStringByAddingPercentEscapes( NULL,

我在iphonetwitter应用程序中使用OAuth/xAuth,密码中包含特殊字符时出现问题。例如密码&。首先,我通过执行以下操作将&转换为%26:

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:

错误域=NSURLErrorDomain代码=-1012用户信息=0x4823e00无法完成操作。NSURlerorDomain错误-1012

我做错了什么?如果我在密码中留下&它会使我的代码崩溃,setParamaters数组将退出。在使用OAuth之前有人遇到过这个问题吗


如果我有字母数字密码,一切正常。。。谢谢你的指导

OAuthRequestParameter已经对名称和值进行了编码;这可能是因为&特别是在造成问题。您是否尝试过使用不同的非标准字符?可能需要修改OAuth库本身。

问题在于,标准OAuth库使用错误字符串,通过添加PercenteScapesusingEncode对用户名和密码进行编码

我的解决方案是创建一个类别来覆盖OARequestParameter中的以下方法

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

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

将以下内容放在项目中的某个位置:

//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