ProgramingTip

applicationWillTerminate 언제 호출되고 호출되지 않을 때

bestdevel 2020. 11. 28. 10:11
반응형

applicationWillTerminate 언제 호출되고 호출되지 않을 때


안녕하세요 저는 applicationWillTerminate가 호출되고있는 것에 대한 몇 가지 질문을 읽었습니다.

다르게 말하는 여러 게시물이 있기 때문에 한 내용을 요약하고 싶었습니다.

  1. IOS (멀티 태스킹 없음)의 경우 홈 버튼 표시 항상 호출됩니다.

  2. IOS 4 이상

    ㅏ. 그것은되는 하지 ( 백그라운드 앱 실행할 때) 홈 버튼을 누를 때 호출

    비. 멀티 태스킹 도크에서 앱을 닫을 때 호출하지 않고 앱에 info.plist의 갑작스런 종료 플래그가 있기 때문에 호출하지 않습니다. ( "응용 프로그램이 앱 사망 이벤트를 가져와야합니다"를 설정 한 다음 멀티 태스킹 도크에서 앱을 닫을 때도 종료 기능이 호출되지 않음)

바탕으로 몇 가지 질문이이를

애플리케이션이 App Died 이벤트 플래그를 가져 오도록 설정하는 것이 좋은 방법입니까? ( "응용 프로그램이 앱 사망 이벤트를 가져와야합니다"를 설정 한 다음 멀티 태스킹 도크에서 앱을 닫을 때도 종료 기능이 호출되지 않음)

또는

"UIApplicationWillTerminateNotification"에 등록하는 것이 info.plist 설정보다 더 나은 방법입니까?

기본적으로 앱이 백그라운드로 엄격한 때가 종료 될 때만 몇 가지 작업을 수행해야합니다.

또는

편집 (1) : 앱이 종료되면 다음이 앱으로 전송됩니다. 어떻게 잡나요?

프로그램 수신 신호 :“SIGKILL”.

편집 (2) :

참고 : 멀티 태스킹 도크에서 제거 할 때 IOS 4 이상에서는 호출되지 않습니다. 그렇게 생각할 수도 있습니다. 하지만 제 경우에는.

이유를 아는 사람이 묻습니다. 내가 놓친 다른 서열 있습니까?

또한 "응용 프로그램이 App Died 이벤트를 가져와야합니다"를 설정 했는데도 호출되지 않았습니다.

편집 (3) :

다음 질문에 대한 답변도 작동하지 않습니다. applicationWillTerminate가 호출되지 않습니다.

나와있는 문제에 직면 한 사람이?


간단히 말해, UIApplicationExitsOnSuspendInfo.plist에서 YES로 설정 하지 않는 한 iOS4 이상에서는 applicationWillTerminate:호출 될 보장이 없습니다 .

설명서를 말한다 :

백그라운드 실행을 지원하는 애플리케이션의 경우 애플리케이션이 백그라운드로 이동하기 때문에 사용자가 애플리케이션을 종료 할 때 일반적이 메소드가 호출됩니다. 그러나이 메소드 응용 프로그램이 백그라운드에서 실행되고 (일시 중단되지 않음) 시스템이 어떤 버전이 종료해야하는 상황에서 호출 될 수 있습니다.

(강조 광산.)

앱이 종료되기 전에해야 할 일이 applicationDidEnterBackground:있습니다. SIGKILL을 잡을 방법이 없습니다.


-applicationWillTerminate:다음 테스트에서 전화를받는 것을 봅니다 . 새 프로젝트 ( 'Single View Application'템플릿 사용)에서 AppDelegate에 다음을 추가합니다.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    NSLog(@"%s", __PRETTY_FUNCTION__);

    __block UIBackgroundTaskIdentifier identifier = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    }];

    dispatch_async(dispatch_get_main_queue(), ^{
        for (int i=0; i < 20; i++) {
            NSLog(@"%d", i);
            sleep(1);
        }
        if (identifier != UIBackgroundTaskInvalid) {
            [[UIApplication sharedApplication] endBackgroundTask:identifier];
            identifier = UIBackgroundTaskInvalid;
        }
    });
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    NSLog(@"%s", __PRETTY_FUNCTION__);
}

이 예제는 앱이 백그라운드로 들어갈 때 백그라운드 작업을 시작합니다. 이 작업은 앱이 앱 스위처에서 종료 될 수있을만큼 충분히 오랫동안 앱이 백그라운드에서 실행되도록 유지하는 (1 초에 한 번 로깅 포함) 20 초 지연입니다.

따라서 테스트하려면 앱을 실행하고 홈 버튼을 눌러 앱을 백그라운드로 보낸 다음 20 초 지연이 시작되기 전에 앱 전환기에서 앱을 제거합니다. 20 년대 말 이후에 -applicationWillTerminate:호출됩니다. Xcode에서 콘솔을보고 이것이 사실인지 확인할 수 있습니다.

iOS 5.1 및 6.1 (모두 iPhone) 용 iOS 시뮬레이터에서이 작업을 시도한 결과 두 경우 모두에서 발생하는 것을 확인했습니다. 또한 iOS 6.1.2를 실행하는 iPhone 4S에서 테스트 한 결과 동일한 동작을 확인했습니다.


아시다시피 귀하의 응용 프로그램이 종료되는 세 가지 상황이 있습니다.

  1. 최종 사용자에 의해 종료, 당신은 뭔가 할 수 -[UIApplication applicationWillEnterBackground:]있으며,이 경우에, -[UIApplication applicationWillTerminate:]호출되지 않습니다를.

  2. 메모리 부족과 같은 시스템에 의해 삭제 -[UIApplication applicationWillTerminate:]되면에서 무언가를 할 수 있습니다.이 경우 applicationWillEnterBackground:호출 되었는지 여부 알 수 없습니다 .

  3. 충돌, 어떤 종류의 충돌보고 도구를 사용하는 것 외에는 아무것도 할 수 없습니다. (편집 : 잡기 SIGKILL불가능)


출처 : http://www.cocos2d-iphone.org/forum/topic/7386

내 상태 저장 코드를 applicationWillTerminate에서 applicationDidEnterBackground로 복사하고 multitaskingEnabled 부울을 추가하여 applicationDidEnterBackground에서만 상태 저장을 호출하도록했습니다. 왜냐하면 applicationWillTerminate가 호출되는 멀티 태스킹 장치에는 하나의 인스턴스가 있습니다. 앱이 포 그라운드에 있고 장치의 전원을 끄는 경우. 이 경우 applicationDidEnterBackground 및 applicationWillTerminate가 모두 호출됩니다.


우리는 앱이 -applicationWillTerminate호출 될 때 5 초 밖에 안된다는 것을 알고 있습니다. 그래서 누군가가 그 시점에서 서버를 업데이트하고 싶다면. 동기 호출을 사용하는 것보다.

[NSURLConnection sendSynchronousRequest:urlRequest returningResponse:nil error:&error];

참고 :- -applicationWillTerminate 앱이 일시 중단 상태에서 종료되면 호출되지 않습니다. 일시 중단 상태는 앱이 백 그룹에서 작동하지 않음을 의미합니다. 이에 대한 해결책 중 하나는 백그라운드 작업을 사용하는 것입니다.


// 절대 응답 applicationWillTerminate

func applicationWillTerminate (application : UIApplication) {

    print("applicatoinWillTerminate")

    // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
}

1 단계 : command + shift + h (더블 클릭 (탭))

2 단계 : 앱 위쪽으로 이동 (kill)

3 단계 : applicationWillTerminate 작업

참고 URL : https://stackoverflow.com/questions/7818045/applicationwillterminate-when-is-it-called-and-when-not

반응형