5

앱이 배경에있는 동안 서버로 데이터를 전송하는 애플리케이션이 있습니다.데이터가 백그라운드에서 3G를 통해 전송되지 않음

-(bool) sendStats: (MCStatsSender*) val{ 

    if(![self checkInternet]){ //Using Reachability here 

     return false; 
    } 

    NSDictionary *inputData = [NSDictionary dictionaryWithObjectsAndKeys: 
           self.propertyA.value, "key1", 
           val.data, "key2", 
           nil]; 


    [myNetworkManager doRequest:[myRequestManager createWithStringAndDictionary:MY_URL Data:inputData handler:myHandler user:val]]; 
    return true; 
} 

그래서 inputData 문자열 간단한 사전은 다음과 같습니다 여기에 데이터 송신을 담당하는 코드입니다.

방법 doRequest가 NSURLSession에 따라 기본적으로이처럼 보이는 :

-(void) doRequest: (MCRequest*) request{ 

    [tasks addObject:request]; 

    if(m_session == nil){ 
     NSURLSessionConfiguration* config = [NSURLSessionConfiguration backgroundSessionConfigurationWithIdentifier:[NSString stringWithFormat:@"key-%lu",reqid]]; 
     m_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil]; 
    } 

    NSURLSessionDataTask* task = [m_session dataTaskWithRequest:request.generatedRequest]; 
    request.reqId = task.taskIdentifier; 
    [task resume]; 
} 

내가 말했듯이, 모든 와이파이 통해 작동, 응용 프로그램이 백그라운드로 전환하고, 몇 분 후, 사용자 정의 블루투스 장치가 일부 데이터를 보내고 일시 중단 모드에서 응용 프로그램을 깨 웁니다. iOS 응용 프로그램에서 데이터를 수신 한 후 장치가 3G를 통해 연결되어 있으면 데이터를 서버로 보내지 못합니다. 나는 그것이 로컬 데이터베이스에 저장되어 있기 때문에 블루투스를 통해 전송 된 데이터가 수신된다는 점에 긍정적이다.

또 다른 중요한 사실 하나가 있습니다. 응용 프로그램이 Xcode를 통해 실행되는 경우 장치가 3G를 통해 연결되어 있어도 응용 프로그램은 백그라운드에서 데이터를 보냅니다. 이렇게하려면 앱을 실행 한 다음 홈 버튼을 탭하여 앱을 배경으로 설정합니다.

차이점은 무엇이며 Mac에 케이블을 연결하면 앱이 다르게 작동하는 이유와 3G (또는 2G)를 통해 데이터가 전송되지 않는 이유를 모르십니까?

추가 정보 :

나는 파일을 업로드하려고 아니라, 단지 서버에 JSON을 보낼 수 없습니다입니다.

+0

기기에 블루투스 데이터가 얼마나 남았습니까? – CodeChanger

+0

@ CodeChanger 앱이 5 분 이내에 블루투스에서 데이터를 가져 오는 중입니다. 나는 로컬 sqlite 데이터베이스에 저장하기 때문에 블루투스에서 데이터를 받았다고 확신한다. – Whirlwind

+0

알았어. 3.0 분 이후에 내 지식에 따라 앱이 일시 중지되었으므로 해당 모드를 처리하고 bgTask를 사용하여 서비스에 전화해야합니다. – CodeChanger

답변

4

이것은 전력 사용에 관한 것 같습니다. URL 세션에서 제공되는 백그라운드 업로드는 편의성이 있으며 운영 체제를 무시한 상태에서 제공됩니다. 데이터를 보내지 만 언제 선택할 수 있습니다.

데이터를 전송할 때 영향을주는 요소는 기기가 전원에 연결되어 있는지, 데이터 연결 품질 (데이터를 전송하는 데 걸리는 시간과 전력량), 기기가 수행중인 기타 기기 (여러 개의 업로드를 결합 할 수 있습니까?)

따라서 백그라운드에서 특정 시간에 어떤 작업이 수행되고 있는지 추측하거나 의존 할 수 없습니다.

이러한 종류의 테스트는 실제로 장치에서만 수행되어야하며 테스트에 영향을 미치기 때문에 Xcode에 연결되지 않아야합니다. 대신, 찰스 프록시와 같은 것을 사용하여 네트워크 요청을 기록하고 장치를 사용하고 일정 시간 동안 그대로두고 다른 응용 프로그램을 열고 사용하십시오. 결국 데이터가 전송되는 것을보아야하지만 기다려야합니다.

+0

그래, 좀 더 조사하고 파기 했어. iOS가 앱이 임의의 작업을 수행하기에 좋은 상태인지를 결정할 때 두 가지 주요 요인 인 대부분 전력과 Wi-Fi에 관한 것이다. 물론, 당신이 말했듯이 다른 요소도 있습니다 ... – Whirlwind

+0

앱이 백그라운드에 있다면 아무런 데이터도 보내지지 않습니다. 1 분이 아니라 1 분 후에가 아니라는 것이 문제입니다. 문제는 요청을 처리하는 클래스를 작성한 사람이 아니기 때문에 모든 것이 올바르게 구성되었다는 것을 100 % 확신 할 수는 없기 때문입니다 (클래스 자체가 문제가있는 경우).몇 가지 검사를하고 결과에 대해 알려 드리겠습니다. 나는 배터리가 이것과 함께 무엇인지 알기 위해 컴퓨터에 연결된 장치를 테스트하고있었습니다. 물론 나중에 장치를 분리합니다. – Whirlwind

+0

방금 ​​재미있는 Charles 프록시를 사용해 보았습니다. 편리한 응용 프로그램이지만 내 경우에는 도움이되지 않습니다. Wi-Fi 연결이 필요하기 때문입니다. 기기가 Wi-Fi를 통해 연결된 경우 네트워크 요청이 전송됩니다 (본인의 질문에 언급 된 것처럼). 문제는 셀룰러 (3G) 연결입니다. 어쨌든, 요청이 성공했는지 아닌지 이미 서버에 표시되어 있기 때문에 실제로 그 앱이 필요하지 않습니다. NSURLSession, 구성 및 백그라운드 작업을 조금 실험 해 보겠습니다. – Whirlwind