Mad*_*doc 12 iphone asihttprequest
我在我的应用程序中使用ASIHTTPRequst并且遇到了一些问题,但仅限于某些设备.在某些情况下,我收到以下错误:
"检测到不正确的NSStringEncoding值0x0000.假设NSASCIIStringEncoding.将在不久的将来停止这种兼容性映射行为"
我得到了有限的测试选项,因为它适用于我的所有内部测试设备,但问题仍然发生在我的一个或多个客户端测试手机上.这也可能是手机连接到蜂窝网络的情况,因为它似乎正在使用wifi.
有谁知道可能导致问题的原因是什么?我看到有类似的问题类型,但我的代码看起来是正确的,从其他问题答案和ASIHTTPRequest网站.
编辑 发生错误时,不会收到服务器的响应,因此用户卡在注册/登录状态.
urlEncodeValue:
- (NSString *)urlEncodeValue:(NSString *)str
{
NSString *result = (NSString *) CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)str, NULL, CFSTR(":/?#[]@!$&’()*+,;="), kCFStringEncodingUTF8);
return [result autorelease];
}
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
rva*_*lue 15
从/sf/ask/577582281/复制我的答案- 您很可能收到此消息,因为您正在调用getResponseString
失败的请求.你应该确保在调用之前检查是否有响应:我发现测试总请求失败的一种方法(即网络/服务器关闭)是检查:
if (request.responseStatusCode == 0) {
// the request failed entirely
} else {
// you at least got a HTTP response
}
Run Code Online (Sandbox Code Playgroud)
如果[asiHttpRequest getResponseString]
在返回有效响应并且已设置请求编码(即无法连接到服务器)之前调用,则会发生这种情况.
解决此警告的最简单方法是编辑ASIHTTPRequest
类,删除@synthesize responseEncoding
并添加一个简单的自定义getter/setter,以便在未设置响应编码时返回默认编码:
- (NSStringEncoding) responseEncoding
{
return responseEncoding || self.defaultResponseEncoding;
}
- (void) setResponseEncoding:(NSStringEncoding)_responseEncoding
{
responseEncoding = _responseEncoding;
}
Run Code Online (Sandbox Code Playgroud)
此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];
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
10582 次 |
最近记录: |