我在我的应用程序中使用ASIHTTPRequst,我有一些问题,但只在某些设备上。在某些情况下,我得到以下错误:
检测到不正确的NSStringEncoding值0x0000。假设NSASCIIStringEncoding.将在不久的将来停止这种兼容性映射行为
我有有限的选择来测试它,因为它可以在我所有的内部测试设备上工作,但是这个问题仍然发生在我的一个或多个客户端测试手机上。这也可能是当手机连接到蜂窝网络时的情况,因为它似乎在无线网络上工作。
有人知道是什么导致了这个问题吗?我看到了类似的问题类型,但是我的代码看起来与其他问题答案和ASIHTTPRequest站点一样正确。
当错误发生时编辑,没有收到来自服务器的响应,因此用户被卡在寄存器/登录。
urlEncodeValue:
- (NSString *)urlEncodeValue:(NSString *)str
{
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}ASIHTTPRequest代码片段:
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
}发布于 2011-11-24 01:23:21
从https://stackoverflow.com/q/8251175/918764复制我的答案--您很可能会收到这条消息,因为您在请求失败时调用了getResponseString。您应该确保在调用之前检查是否得到了响应:我发现测试总请求失败(即网络/服务器故障)的一种方法是检查:
if (request.responseStatusCode == 0) {
// the request failed entirely
} else {
// you at least got a HTTP response
}如果在返回有效响应并设置了请求编码(即无法连接到服务器)之前调用[asiHttpRequest getResponseString],就会发生这种情况。
解决此警告的最简单方法是编辑ASIHTTPRequest类,删除@synthesize 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];
}https://stackoverflow.com/questions/8136925
复制相似问题