2013-04-21 67 views
3

我正在開發一個使用API​​的iphone應用程序。
iOS/xcode:didReceiveData當在設備上運行時爲空,但在模擬器上罰款?

在'模擬器'它工作正常。在'設備'api調用所有運行但響應委託都返回空。

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與provi sioned個人資料和工作)都運行在同一個Wifi(我的家庭路由器)。


的API:
的API返回JSON少量和我有一組不同的JSON和器件和模擬器返回完整JSON沒有問題的測試,我只是不能讓它工作與這個API。
我甚至在不同位置有相同的JSON(api返回),我可以做相同的請求(帶有頭文件和身份驗證),它對設備沒有任何問題。奇怪的是,雖然連接對象仍然不適合僞造的api服務器。在設備didReceiveResponse1 connection <NSURLConnection: 0x1af600>仍然並沒有與連接url(但運行在模擬器它有1 connection <NSURLConnection: 0x8193fd0, http://test-server.com:81/api-data.json>)。這表明其設備模擬器NSURLCONNECTION對象之間的正常差異。
我覺得這可能是認證的方式獲得,但API是完全開放的(假設你有令牌)並用模擬器加didFailWithError是跑不了的工作沒有問題..

我已經宣佈委託方法在頭文件裏面。
不知道爲什麼連接對象和數據對象都會有問題。


備選:
我嘗試下面的方法獲取,而不是什麼我已經內,但它也適用於模擬器但同樣的事情發生在設備

//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]; 

我會很感激任何想法。

感謝

回答

5

來進行測試:從請求

  1. 刪除緩存(它可以做一些很有趣的事情)。
  2. connection:didReceiveResponse:中打印出HTTP狀態碼。確保你得到了200(你應該總是檢查狀態碼!)
  3. 在其他REST客戶端(大多數瀏覽器的插件存在)中測試連接。
  4. 確保API不是「用戶代理」敏感的。
  5. 如果使用「https」協議,請確保證書由設備已知的根授權機構簽署。
  6. 使用調試器檢查一切正常工作(例如url不是nil,當創建請求時)。
  7. 您確定您使用的是正確的Authorization標題嗎?價值Token token="..."似乎很奇怪。
+0

(3)在Firefox RESTCLIENT上完成並沒有問題。沒有https(5)。標題是相同的,並且可以在模擬器(4)中正常工作。現在嘗試(2)。最好怎麼做(1)? – 2013-04-21 16:19:53

+1

@CraigTaub for 1 - 設置請求緩存策略爲NSURLRequestReloadIgnoringLocalAndRemoteCacheData – 0x8badf00d 2013-04-21 16:22:40

+0

謝謝...好主意檢查狀態碼,它返回的'401(非授權)',這對於模擬器來說是非常奇怪的......(6)已經檢查過,是的,它的正確和(7)同樣的事情。 – 2013-04-21 16:23:41

相關問題