iOS / xcode:didReceiveData在设备上运行时为空但在模拟器上运行良好?

时间:2013-04-21 15:24:40

标签: objective-c json api

我正在开发一个使用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];

我很欣赏这方面的任何想法。

感谢

1 个答案:

答案 0 :(得分:5)

进行测试:

  1. 从请求中删除缓存(它可以做一些非常有趣的事情)。
  2. connection:didReceiveResponse:中打印HTTP状态代码。确保你得到200(你应该总是检查状态代码!)
  3. 在其他一些REST客户端中测试连接(存在大多数浏览器的插件)。
  4. 确保API不是“用户代理”敏感。
  5. 如果使用“https”协议,请确保证书由设备已知的根权限签名。
  6. 使用调试程序检查所有内容是否正常工作(例如,url不是nil,在创建请求时。
  7. 您确定正确使用Authorization标头吗?价值Token token="..."似乎很奇怪。