2012-02-10 2 views
1

내가 이상한 상황이이 클라이언트는 응용 프로그램이 백그라운드에서 실행되지 않지만 응용 프로그램이 종료되기 전에 여전히 작업을 수행 할 수 있습니까?

Application does not run in background = YES; 

그러나 응용 프로그램이 서버에 일부 데이터를 업로드해야하는 애플리케이션 라이프 사이클 동안의 시간이있다, 자신의 어플은 같은 info.plist에 플래그를 생성하므로 멀티 태스킹 지원하려는 does't 종료하기 전에. 그렇지 않으면 서버에 퍼지 데이터가 있고 클라이언트의 회사 (그리고 나 역시 ...)가 운명을 질 것입니다!

이제 내 질문은,

  • OS 내 응용 프로그램을 종료하기 전에 내가 얼마나 많은 시간이 있습니까? 경우에 따라 데이터를 업로드 할 때 크기가 커질 수 있으며 인터넷 속도가 느린 경우 시간이 더 필요할 수 있습니다.
  • 이 방법은 내 상황에서 beginBackgroundTaskWithExpirationHandler가 작동한다는 것을 알았습니다. 나는 배경 실행을 지원한다면 이것이 효과가 있을지 의심 스럽다. 내가 맞습니까?

마지막 질문,

  • 내가 생각할 수있는 다른 옵션

    ?
  • iOS 개발자로서 사임해야하나요?

감사

+0

UIApplicationExitsOnSuspend = YES 및 beginBackgroundTaskWithExpirationHandler를 함께 사용해 볼 수 있다고 생각합니다. 빠른 테스트이며 작동하면 원하는 것을 얻을 수 있습니다. – anticyclope

답변

2

내 조언은 다음과 같이 뭔가를 시도하는 것입니다 :

[[NSNotificationCenter defaultCenter] 
addObserver:self 
selector:@selector(saveWhatever) 
name:UIApplicationWillTerminateNotification 
object:nil]; 

은 그냥 클래스의 init 방법에 해당 코드를 넣습니다. 이 같은 viewDidUnload에서 관찰자로서 자신을 제거해야합니다 : 여기

[[NSNotificationCenter defaultCenter] removeObserver:self]; 

당신이 저장해야 무엇이든 저장할 수 있습니다,하지만 난 데이터를 업로드 확실하지 않다. 최선의 방법은 여기에 파일에 데이터를 저장하고 다음에 응용 프로그램을 열 때 파일에서 서버로 비동기 적으로 데이터를 업로드하는 것입니다. 이 알림을 사용하여 업로드를 시도해 볼 수 있습니다. 스프링 보드가 일어날 때까지 기다릴 수 있을지 잘 모르겠습니다.

+1

@dontCheckMyBlog - 가지고있는 시간은 불확실하지만 길지 않습니다. 응용 프로그램이 종료하려고 할 때 다운로드에서 짜내려고하면 고민 거리가됩니다. Rickay가 맞습니다. 다음에 시작할 때 플래그를 설정하고 다운로드를 수행하십시오. (그리고 사직하지 말고 그냥 계속 배워야한다. 거기에 아이폰 OS 개발자가 엄청나게 부족하다. 요구 조건을 철회하라.) – Rayfleck

+1

좋은 전화와 사임하지 말라는 충고. iOS 개발은 미친 세상처럼 보일지도 모르지만 Apple API는 구현하기 쉽고 가장 문서화 된 것 중 일부입니다. 또한 너무 복잡하지 않은 데이터가 많은 경우 데이터를보다 신속하게 관리하기 위해 싱글 톤을 구현하는 것이 중요 할 수 있습니다. 그렇지 않으면 필자는 Core Data를 살펴볼 것입니다. Apple이 문서에서 언급했듯이 엔트리 레벨 기술이 아니기는하지만 말입니다. 행운을 빕니다! –

+0

@ Rayfleck, Lol 감사합니다. 두 분 모두의 충고입니다. – doNotCheckMyBlog

2

? 아마 아니지만, 현실적인 기대를 가진 다른 회사에서 일할 것인가? 명확히. 어리석은 디자인 아이디어를 주장하고 이성을 경청하지 않는 고객은 모두 배 모양이 될 때 개발자를 비난 할 가능성이 더 많습니다.

종료 할 때 데이터 업로드를 시도합니다. 하지 마. 워치 독 타이머는 타이머가 매달아 죽이기 전의 시간을 예측할 수 없습니다. 나는 앱이 무작위로 시작하지 못하는 기존 프로젝트에서 일하기 시작했을 때 비슷한 상황에 직면했다. 문제는 개발자가 다운로드 코드를 애플리케이션에 넣었습니다 : didFinishLaunchingWithOptions : 메소드입니다. 인터넷 대기 시간과 서버 대기 시간 문제로 인해이 메서드는 너무 오래 걸렸고 코드를 백그라운드 스레드로 옮겨야했습니다.

종료, 수면 등에서 동일한 작업을 시도하면 동일한 문제가 발생하며 워치 독 타이머가 앱을 종료하지 못하게하는 알려진 방법이 없습니다.

내가 가진 다른 질문은 클라이언트가 멀티 태스킹에 강한 이유는 무엇입니까? 왜 그들은 신경을 쓰나요?실제로 어떤 앱이라도 사실상 앱을 중지시킬 수는 없습니다. 나는 그들이 멀티 태스킹을 원하지 않는다면 인터넷 접속이나 애니메이션의 어떤 형태도 원하지 않는다고 추정한다. 이러한 것들을 스레딩하지 않으면 UI가 사용할 수 없으므로 1 별표 및 불만이 많습니다.

+0

전 세대 컴퓨팅이 이런 종류의 재미있는 디자인 선택에 직면 해 있다고 생각합니다. 사람들은 데스크톱 통근에서부터 태블릿 및 스마트 폰 컴퓨팅에 이르기까지 방대한 변화에 저항하기 어렵습니다. 그들은 단지 이런 일을하지 않습니다! 그들은 일을 매우 desktopy 방식으로 생각하는 것을 좋아합니다! 롤 (Desktopy). – doNotCheckMyBlog

+1

당신은 사람들을 알고 있습니다 -하지만 때로는 이런 종류의 일은 고객이 어리 석다는 것이 아니라 고객이 뭔가를 의미하는 것을 잘못 이해했다는 것을 보여주는 것입니다 (멀티 태스킹). 따라서 클라이언트의 신중한 질문을 통해 볼 수 있습니다 그들이 실제로 무슨 말을하는지 알고 있다면 :-) – drekka

1

데이터를 서버에 업로드 할 때 중요합니까? 응용 프로그램이 종료되기 전에 올바른해야합니까? 그렇지 않으면

, 나는이 제안이 있습니다, 응용 프로그램 샌드 박스 파일 시스템의 (즉 도서관의 텍스트 파일에 모든 데이터를 mydata.txt 같은 것을 쓰기 앱 위임 방법 applicationWillTerminate에서

를/캐시 디렉토리 : 응용 프로그램이 생성 한 파일에 Document 디렉토리를 사용할 수 없습니다. Apple은 이제 Document 디렉토리를 사용하여 iCloud 동기화를 수행하므로 파일을 저장하면 응용 프로그램이 거부됩니다. 파일을 표시하려면 iCloud 속성과 동기화하지 않아야합니다.

그런 다음 응용 프로그램을 시작할 때이 "mydata.txt"파일이 있는지 확인할 수 있습니다. 존재하는 경우, 모든 데이터를 읽고 서버에 업로드하십시오. 그런 다음 Library/Cache 폴더에서 파일을 삭제하면 다음 번에 동일한 데이터가 업로드되지 않습니다. App Delegate의 applicationDidFinishLaunching 메소드에서이 작업을 수행 할 수 있습니다.

관련 문제