2016-11-08 6 views
1

iOS 앱은 NSURLSessionConfiguration, NSURLSession, NSURLSessionDownloadTask 등을 사용하여 당사 서버가 데이터베이스에서 즉시 생성하는 XML 파일을 다운로드합니다. 하나의 특정 계정에서 더 큰 파일을 다운로드 할 때까지 모든 것이 다운로드와 함께 잘 작동합니다. 우리 서버는이 계정에 XML을 제공하기 전에 많은 작업을해야합니다. 즉, 서버가 실제로 요청 된 xml을 뱉어 내기 전에 다소 시간이 걸릴 수 있습니다. 서버가 데이터를 성공적으로 처리하고이를 클라이언트에보고하는 경우에도이 가장 큰 계정의 경우 iOS 클라이언트는 데이터를 수신하지 않습니다.내 NSURLSessionDownloadTask 다운로드가 내 클라이언트에 도달하지 않는 이유는 무엇입니까?

테스트 동안, 우리는 특이한 것을 발견 :

  1. 우리는 어떤 Safari 브라우저 (데스크탑 또는 iOS)에서 같은 XML을 다운로드 할 수 없습니다 우리는 바탕 화면에 크롬을 사용하여 XML을 다운로드 할 수 있습니다
  2. 우리 우리의 iOS 앱에서 명령 줄
  3. 에 컬을 사용하여 XML을 다운로드 할 수 있습니다, 그것은 장치 나 시뮬레이터에서 XML을 다운로드하지
,

나는 timeoutIntervalForRequest와 timeoutIntervalForResource를 모두 올렸습니다. 그것은 "시간 초과"가 아닙니다. 그러나 애플의 네트워킹 스택에 뭔가가있는 것 같아서 XML이 서버에 의해 오랫동안 기다려지는 것을 허용하지 않는다. Chrome과 컬링에 문제가없는 이유는 무엇입니까? Safari와 iOS 코드는 어떻게됩니까? 그래서 나는 여기서 어떤 일이 일어나고 있는지를 놓치고 있습니다.

이것은 기존 서버 코드이며 앞으로 JSON 및 더 빠른 클래스로 변경 될 것이므로 "서버 코드 변경"답변이 필요하지 않습니다.

나를위한 아이디어가 있습니까? 미리 감사드립니다.

+0

나는 또한 AFNetworking과 컬을 시도했는데, 모두 프로젝트에서 실패합니다. 하지만 터미널에서 똑같은 컬을 작동시킬 수는 있습니다. – Erick

답변

2

두 개의 시간 초과가 있습니다. 첫 번째 것은 특정 기간 동안 데이터가 없을 때 발생합니다. 다른 하나는 요청이 특정 기간에 완료되지 않을 때입니다. 둘 다 충분히 높을 필요가 있습니다. 내 생각 엔 서버가 심지어 그 첫 번째 시간 제한 내에 상태 코드를 보내지 않아서 NSURL 스택이 서버가 죽었다 고 가정하게됩니다.

문제를 줄이기 위해 매개 변수를 조정할 수 있더라도 네트워크 연결이 (특히 셀룰러 연결의 경우) 0이 아닌 확률로 "서버 변경"만 가능한 유일한 기회입니다. 무작위로 떨어 뜨려 라.

매개 변수없이 작은 래퍼 스크립트를 작성하는 것이이 문제를 해결하는 가장 쉬운 방법 :

  • 즉시 자원에 대한 고유 식별자 (UUID)를 반환합니다.
  • 는 이름으로 그 UUID와 함께,
  • 저장 My-UUID-Goes-Here.meta 또는 유사한에서 libcurl에 의해 제공되는 예상 파일 길이를 서버에서 자원을 요청하고 파일에 기록 (서버) 비동기 컬 작업을 생성합니다.
  • 이상이 생기면 파일을 삭제합니다.

또는 UUID 매개 변수 :

  • 는 UUID가 특수 문자가없는 적절한 UUID입니다 확인합니다.
  • 특정 디렉토리에 해당 UUID가있는 파일이 있는지 확인하고 파일이 완료되었는지 확인합니다.
  • 파일이 불완전한 경우 수신 바이트 수와 총 예상 바이트 수를 제공합니다 (또는 "준비 안 됨"이라고 말함).
  • 그렇지 않으면 파일을 반환하고 즉시 삭제합니다.

아마도 코드 줄 수십 줄, 아마도 두 줄짜리 크론 스크립트를 사용하여 하루가 넘은 파일을 정리할 수 있습니다.

그런 다음 앱에서 데이터를 요청하고 UUID를 다시받을 수 있습니다. 그런 다음 서버에 데이터가 있는지 여부를 주기적으로 요청할 수 있으며 "여기에 데이터가 있습니다"또는 "아직 없습니다"라고 표시된 즉석 응답이 반환됩니다.

+0

흥미로운 응답, 감사합니다! 예, 시간 초과 값 모두 하늘 높이로 설정했습니다. – Erick