2013-09-10 4 views
2

타이머 앱을 가지고 있습니다. 사용자가 타이머를 종료 할 때까지 무기한으로 계산됩니다. 기본 iOS 시계 스톱워치와 매우 유사합니다.타이머 앱이 IOS에 의해 종료되지 않도록하려면 어떻게해야합니까?

책임있는 배경 앱에 관한 기사를 읽었습니다. 나는 UI 변화가 일어나지 않고 앱이 백그라운드에서 전경으로 돌아 왔을 때 타이머를 다시 시작할 때 타이머를 멈춘다. 앱은 30 분마다 로컬 알림을 보내 사용자에게 휴식을 취하도록 상기시킵니다.

문제 : 내 앱이 몇 시간 (2-6 시간 정도) 후에 종료되고 현재 타이머 및 정보가 손실됩니다.

것들 나는 시도했다 :

-as는 내가 타이머 UI도 배경에있는 동안, 카운트 업 또한 타이머 실행했다 전에 (책임있는 배경 응용되는 지침을 따르지 내 응용 프로그램을 변경 전술). 내 응용 프로그램은 많은 메모리를 사용하지 않거나 집중적 인 작업을 수행하지 않기 때문에 문제가 해결 될 것이라고 생각했습니다.

-I 또한 ApplicationWillTerminate의 현재 타이머 (NSUserDefaults)의 데이터를 저장 한 다음 DidFinishLaunchingWithOptions에서 복원하려고 시도했습니다. 그것은 작동하지 않는 것 같습니다. ApplicationWillTerminate가 호출 될 경우 데이터를 저장하고 응용 프로그램이 다시 시작될 때 복원 할 것이기 때문에 내 응용 프로그램이 강제 종료되는 것과 비슷합니다. 신비.

현재 NSTimer의 시작 시간 인 NSDate를 ApplicationDidEnterBackground에 저장하고 타이머를 무효화하고 타이머를 시작하고 ApplicationWillEnterForeground에서 시작 시간을 복원합니다. 아직도 운이 없다.

이것은 사용자의 아주 작은 부분에 영향을 미치기 때문에 모든 사용자에게 문제가되지 않으므로 혼란 스럽습니다. 저는 여전히 절름발이 버그이기 때문에 그것을 고치고 싶습니다. (아이폰 5에서) 나 자신과 마주 쳤기 때문에, 아이폰의 오래된 메모리가 부족하거나 다른 문제가있는 것은 아닙니다.

이것은 정말 저를 괴롭혔습니다. 저는 연구를 해본 결과 스택 오버플로에 관한 질문을 상당히 잘 닦아 냈고 저에게 많은 도움을 줄 것으로 보이지 않습니다.

도움이 될만한 질문이 있으시면 언제든지 문의 해주십시오.

+0

OS가 앱을 죽이는 것이 왜 중요한가요? 앱이 실행되는 동안 로컬 알림을 예약 할 수 있으며 사용자는 여전히 앱을 볼 수 있습니다. 현재하고있는 것처럼 시작 시간을 저장할 수 있습니다. 사용자가 앱을 사용하지 않는 경우, 공간과 전원을 사용하여 백그라운드에 앉아있을 필요가 없습니다. – Caleb

+0

사용자가 앱을 시작하면 시작한 이후 경과 한 시간과 앱이 종료되어 정보가 손실 된 것을 확인하기를 원하기 때문입니다. ApplicationWillTerminate가 호출되지 않는다는 문제가 (Wain이 지적했듯이) 생각합니다. 정보가 저장되지 않습니다. 나는 이것을 확실히 테스트하고있다. 나는 이상하게도 그것을 발견한다. 단 몇 시간 만 지나면 내 애플리케이션이 죽을 것이다. 특히 백그라운드에서 아무 일도 일어나지 않기 때문에. – LazerLex

답변

2

applicationWillTerminate은 기본적으로 호출되지 않습니다. 앱이 백그라운드에 있고 메모리에서 제거되면 호출되지 않습니다. 잠시 동안 사용하지 않으면 앱이 메모리에서 제거 될 것으로 예상됩니다. "잠시"의 시간은 기기가 그 당시에 무엇을하고 있는지에 달려 있습니다 ... applicationDidEnterBackground: 또는 applicationWillResignActive:을 사용하는 것이 가장 좋습니다.

+0

applicationWillTerminate를 호출하지 않는 것이 좋습니다. 문제는 applicationDidEnterBackground (NSDate의 타이머 시작 시간)에 데이터를 저장하고 ApplicationWillEnterForeground에서 복원하는 것입니다. 아직도 운이 없다. 메모리 집약적 인 응용 프로그램 인 것처럼 응용 프로그램은 여전히 ​​죽습니다. – LazerLex

+1

당신은 그것이 '살해 당하기'를 기대해야합니다 (메모리에서 제거됨). 올바르게 저장하고 복원하는 경우 다시 가져 왔을 때 작업에 차이가 없어야합니다. – Wain

+0

그래서 "저장하고 올바르게 복원하시오"라고 말하면 NSUserDefaults에 저장하고 (시도한 것처럼) ApplicationDidFinishLaunchingWithOptions에 값을 복원 하시겠습니까? 아니면 국가 보존을 의미합니까? – LazerLex

2

앱이 백그라운드로 들어가면 타이머의 경과 시간을 기록하십시오 (예 : NSUserDefaults 또는 원하는 경우). 또한 현재 시간을 기록하십시오. 앱이 포 그라운드로 돌아 오면, 당신이 기록 된 두 값을보고 즉, 그에 따라 경과 시간을 업데이트 :

이 이

elapsedTime = savedElapsedTime + (currentTime을이 - timeWentIntoBackground)

있어 정말 이유는 앱이 필요가 없다 백그라운드에서 활성화 된 채로 사용자의 배터리를 태우고 초를 계속 추적합니다.

또한 applicationWillTerminate에 의존하지 마십시오. applicationWillEnterBackground를 사용하십시오.

+0

그래서 저는 실제로 그렇게하고 있으며, 몇 시간 후에는 내 앱이 여전히 죽습니다. 백그라운드에서 수행되는 작업 (UILocalNotifications가 전송되는 것 외에는)이 없습니다. – LazerLex

관련 문제