我在我的应用程序中使用ASIHTTPRequst并且遇到了一些问题,但仅限于某些设备。在某些情况下,我收到以下错误:
” 检测到不正确的NSStringEncoding值0x0000。假设NSASCIIStringEncoding。将在不久的将来停止这种兼容性映射行为 “
我的测试选项有限,因为它适用于我的所有内部测试设备,但问题仍然发生在我的一个或多个客户端测试手机上。这也可能是手机连接到蜂窝网络的情况,因为它似乎正在使用wifi。
有谁知道可能导致问题的原因?我看到有类似的问题类型,但我的代码看起来都是正确的,从其他问题答案和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
}
答案 0 :(得分:15)
从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
方法还有一个更具体的解决方法,我认为这是唯一一个使用编码而不检查值的地方 - 因为编码应该设置为任何非零长度响应:< / p>
- (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];
}