我正在开发一个使用API的iPhone应用程序。
在'模拟器'上运行正常。在“设备”上,api调用所有运行但响应委托都返回EMPTY。
LOG:
1) didReceiveData
为设备返回(空NSData
,即< 20>):
append data <20>
但这适用于模拟器:
append data <dfgdf89fgd.....>
2)我在下面的didReceiveResponse
返回设备(设置NSLog以监控NSURLConnection对象)。困惑为什么这不完整:
1 connection <NSURLConnection: 0x147a30>
但是对于模拟器:
1 connection <NSURLConnection: 0x4b76ea0, http://api.site.com/search?id=111>
3) 模拟器
connectionDidFinishLoading
DONE. Received Bytes: 1400
但下面是设备:
DONE. Received Bytes: 1
我的代码:
我在API文件中有以下代码:
- (void)fetch: (NSString *)id{
NSMutableData *receivedData = [[NSMutableData alloc]init];//initialised
self.receivedData = receivedData;//set to available globally
NSString *initialUrl = [NSString stringWithFormat: @"http://api.site.com/search?id=%@",id];
NSURL *url = [NSURL URLWithString:initialUrl];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"Token token=\"apitoken\"" forHTTPHeaderField:@"Authorization"];
[NSURLConnection connectionWithRequest:[request autorelease] delegate:self];
}
-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"1 connection %@",connection);
NSLog(@"didReceiveResponse");
[self.receivedData setLength: 0];
}
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
NSLog(@"2 connection %@",connection);
NSLog(@"append data %@",data);
[self.receivedData appendData:data];
}
-(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
{
//TODO error handling for connection
NSLog(@"Cannot Connect");
if ([_delegate respondsToSelector:@selector(apiFailed:)]) {
[_delegate apiFailed:[error localizedDescription]];
}
}
-(void)connectionDidFinishLoading:(NSURLConnection *)connection
{
NSLog(@"DONE. Received Bytes: %d", [self.receivedData length]);
NSLog(@"FULL DATA: %@",self.receivedData);
}
模拟器和设备(我的iphone已配置配置文件打开并正常工作)都在运行相同的Wifi(我的家用路由器)。
API:
API返回少量的JSON,我已经使用不同的JSON集进行了测试,并且设备和模拟器都返回完整的JSON没有问题,我只能让它与THIS API一起使用。
我甚至在不同的位置有相同的JSON(api返回),我可以执行完全相同的请求(带标题和身份验证),对于设备它没有问题。奇怪的是,连接对象仍然不适合伪造的api服务器。在设备 didReceiveResponse
上仍有1 connection <NSURLConnection: 0x1af600>
,而且没有连接网址(但在模拟器上运行时,它有1 connection <NSURLConnection: 0x8193fd0, http://test-server.com:81/api-data.json>
)。这表明设备和模拟器 NSURLCONNECTION
对象之间存在正常差异。
我觉得可能是认证妨碍了,但是API是完全开放的(假设你有令牌)并且模拟器没有问题加上didFailWithError
没有运行..
我在头文件中声明了委托方法。
不知道为什么连接对象和数据对象都会遇到问题。
的或者:
我在fetch方法中尝试了以下内容,而不是我已经使用的内容,但它也适用于模拟器,但同样的事情发生在设备。
//NSURLCONN and NSDATA in response still return empty???
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL
URLWithString:@"http://api.site.com/search?id=111"]
cachePolicy:NSURLRequestUseProtocolCachePolicy
timeoutInterval:60.0];
[request setHTTPMethod:@"GET"];
[request setValue:@"application/json" forHTTPHeaderField:@"Accept"];
[request setValue:@"Token token=\"mytoken\"" forHTTPHeaderField:@"Authorization"];
NSURLConnection *connection=[[NSURLConnection alloc] initWithRequest:request delegate:self];
我很欣赏这方面的任何想法。
感谢
答案 0 :(得分:5)
进行测试:
connection:didReceiveResponse:
中打印HTTP状态代码。确保你得到200(你应该总是检查状态代码!)url
不是nil
,在创建请求时。Authorization
标头吗?价值Token token="..."
似乎很奇怪。