Iphone 检测到错误的NSStringEncoding值0x0000(使用ASIHTTPRequest)
我在我的应用程序中使用AsiHttpRequest,我有一些问题,但只在某些设备上。在某些情况下,我会出现以下错误: " 检测到不正确的NSStringEncoding值0x0000。假定NSASCIIStringEncoding。将在不久的将来停止此兼容性映射行为 " 我有有限的选择来测试它,因为它可以在我所有的内部测试设备上工作,但问题仍然发生在我的一个或多个客户测试手机上。当手机连接到蜂窝网络时,也可能出现这种情况,因为它似乎在使用wifi 有人知道问题的原因吗?我看到有类似类型的问题,但从其他问题的答案和ASIHTTPRequest网站上看,我的代码看起来都是正确的 编辑 当错误发生时,没有收到来自服务器的响应,因此用户无法注册/登录 urlEncodeValue:Iphone 检测到错误的NSStringEncoding值0x0000(使用ASIHTTPRequest),iphone,asihttprequest,Iphone,Asihttprequest,我在我的应用程序中使用AsiHttpRequest,我有一些问题,但只在某些设备上。在某些情况下,我会出现以下错误: " 检测到不正确的NSStringEncoding值0x0000。假定NSASCIIStringEncoding。将在不久的将来停止此兼容性映射行为 " 我有有限的选择来测试它,因为它可以在我所有的内部测试设备上工作,但问题仍然发生在我的一个或多个客户测试手机上。当手机连接到蜂窝网络时,也可能出现这种情况,因为它似乎在使用wifi 有人知道问题的原因吗?我看到有类似类型的问题,但
- (NSString *)urlEncodeValue:(NSString *)str
{
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
NSString *encodedUrlAdress = [NSString stringWithFormat:@"%@user/register/%@/%@/%@/%d/%@/%@/%@/%@",
kUserServerAddress,
[self urlEncodeValue:_firstName],
[self urlEncodeValue:_lastName],
[self urlEncodeValue:_phoneNumber],
_sex,
[self urlEncodeValue:_birthDate],
[self urlEncodeValue:_address],
[self urlEncodeValue:_postalNumber]];
NSLog(@"encodedUrlAdress: %@", encodedUrlAdress);
NSURL *url = [NSURL URLWithString:encodedUrlAdress];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
// do stuff
}
ASIHTTPRequest代码片段:
- (NSString *)urlEncodeValue:(NSString *)str
{
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
NSString *encodedUrlAdress = [NSString stringWithFormat:@"%@user/register/%@/%@/%@/%d/%@/%@/%@/%@",
kUserServerAddress,
[self urlEncodeValue:_firstName],
[self urlEncodeValue:_lastName],
[self urlEncodeValue:_phoneNumber],
_sex,
[self urlEncodeValue:_birthDate],
[self urlEncodeValue:_address],
[self urlEncodeValue:_postalNumber]];
NSLog(@"encodedUrlAdress: %@", encodedUrlAdress);
NSURL *url = [NSURL URLWithString:encodedUrlAdress];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error) {
// do stuff
}
从复制我的答案-您很可能收到此消息,因为您正在调用getResponseString
,请求失败。在调用此命令之前,您应该确保检查是否收到响应:我发现测试请求总失败(即网络/服务器关闭)的一种方法是检查:
if (request.responseStatusCode == 0) {
// the request failed entirely
} else {
// you at least got a HTTP response
}
如果在返回有效响应和设置请求编码(即无法连接到服务器)之前调用
[asiHttpRequest getResponseString]
,则会发生这种情况
解决此警告的最简单方法是编辑ASIHTTPRequest
类,删除@synthesis responseEncoding
并添加一个简单的自定义getter/setter,以便在未设置响应编码时返回默认编码:
- (NSStringEncoding) responseEncoding
{
return responseEncoding || self.defaultResponseEncoding;
}
- (void) setResponseEncoding:(NSStringEncoding)_responseEncoding
{
responseEncoding = _responseEncoding;
}
getResponseString
方法还有一个更具体的解决方法,我认为这是唯一一个使用编码而不检查值的地方,因为编码应该为任何非零长度响应设置:
- (NSString *)responseString
{
NSData *data = [self responseData];
if (!data) {
return nil;
}
// --- INSERT THIS BLOCK ---
// If the 'data' is present but empty, return a simple empty string
if (data.length == 0) {
return @"";
}
//assert(self.responseEncoding); // if you're into runtime asserts, uncomment this
// --- END OF BLOCK TO INSERT ---
return [[[NSString alloc] initWithBytes:[data bytes] length:[data length] encoding:[self responseEncoding]] autorelease];
}
你应该展示你的urlEncodeValue方法的代码谢谢Tim,它包括现在就我所见这里一切看起来都很好:你有多确定问题发生在代码的这一部分?您说没有收到来自服务器的响应。您是否验证了消息是否正在发送到服务器?我已经一步一步地检查了代码,当请求在以下行超时时会出现错误消息:ASIHTTPRequest*request=[ASIHTTPRequest requestWithURL:url];编辑:但是,这只发生在我的客户的一部测试手机上,我们的手机中没有任何一部出现此问题,因此这很奇怪:\n我现在无法在手机上重现此问题扫描无法解决此问题,需要任何帮助。我有问题,当我火的每一个要求,无论是从模拟器红外设备。谢谢,这是非常有帮助的!很乐意帮忙!我们对使用的ASIHTTPRequest代码进行了一些类似的其他更改,因此我想我会很快制作一个GitHub fork,并将它们全部提交到那里,以获得更大的好处。我们最终放弃了ASIHTTPRequest,因为它在处理野外代理身份验证方面存在一些严重缺陷;直接包装NSURLRequest/NSURLConnection为我们提供了更好的性能和更大的灵活性来处理自定义SSL验证。你的里程数可能会有所不同。回答得很好。请共享GitHub fork的链接。因此,我们可以得到您更改的代码ASIHTTPRequest@AsifBilal不幸的是,当时我的老板没有澄清这一点;所以我不能分享代码。