applicationWillEnterForeground vs. applicationDidBecomeActive, applicationWillResignActive 대 applicationDidEnterBackground


215

응용 프로그램이 백그라운드에서 깨어나서 활성화 할 준비를했을 때 구현할 적절한 위임은 무엇입니까?

applicationWillEnterForeground vs applicationDidBecomeActive-차이점은 무엇입니까?

응용 프로그램이 절전 모드 일 때 데이터를 정리하고 저장하기 위해 준비 할 적절한 위임은 무엇입니까?

applicationWillResignActive와 applicationDidEnterBackground-차이점은 무엇입니까?

또한 수신 SMS 또는 전화가 오면 applicationWillResignActive가 호출되지만 사용자는 확인을 클릭하고 계속하기로 선택합니다. 이 경우 내 앱이 어떤 조치를 취하기를 원하지 않습니다. 사용자가 앱을 종료하지 않았기 때문에 중간 정리없이 계속 실행하고 싶습니다. 따라서 applicationDidEnterBackground에서만 정리 작업을 수행하는 것이 더 합리적이라고 생각합니다.

SMS / 통화에 의해 중단되는 것과 같은 이벤트를 고려할뿐만 아니라 깨우기 및 절전 모드로 구현할 델리게이트를 선택하는 모범 사례에 대한 귀하의 의견에 감사드립니다.

감사

답변:


449

깨어날 때 (스프링 보드, 앱 전환 또는 URL을 통해) 앱을 다시 시작하는 applicationWillEnterForeground:것이 호출됩니다. 백그라운드에 놓은 후 앱을 사용할 준비가되면 한 번만 실행되지만 applicationDidBecomeActive:실행 후 여러 번 호출 될 수 있습니다. 이는 applicationWillEnterForeground:다시 시작한 후 한 번만 수행해야하는 설정에 이상적입니다.

applicationWillEnterForeground: 라고합니다 :

  • 앱을 다시 시작할 때
  • 전에 applicationDidBecomeActive:

applicationDidBecomeActive: 라고합니다 :

  • 이후에 앱이 처음 시작될 때 application:didFinishLaunchingWithOptions:
  • applicationWillEnterForeground:처리 할 URL 존재하지 않는 경우.
  • 이후 application:handleOpenURL:가 호출됩니다.
  • applicationWillResignActive:사용자 무시가 전화 또는 SMS와 같은 중단으로합니다.

applicationWillResignActive: 라고합니다 :

  • 전화 통화와 같은 방해가있을 때
    • 사용자가 전화를 받으면 applicationDidEnterBackground:호출됩니다.
    • 사용자가 무시하면 호출 applicationDidBecomeActive:이 호출됩니다.
  • 홈 버튼을 누르거나 사용자가 앱을 전환 할 때
  • 문서는 당신이해야한다고 말한다
    • 진행중인 작업을 일시 중지
    • 타이머 비활성화
    • 게임을 일시 중지
    • OpenGL 프레임 속도 감소

applicationDidEnterBackground: 라고합니다 :

  • applicationWillResignActive:
  • 문서는 다음과 같이 말합니다.
    • 공유 리소스 해제
    • 사용자 데이터 저장
    • 타이머 무효화
    • 앱이 종료 된 경우 복원 할 수 있도록 앱 상태를 저장하십시오.
    • UI 업데이트 비활성화
  • 필요한 것을 수행하고 메소드를 반환하는 데 5 초가 걸립니다.
    • ~ 5 초 내에 돌아 오지 않으면 앱이 종료됩니다.
    • 당신은 더 많은 시간을 요청할 수 있습니다 beginBackgroundTaskWithExpirationHandler:

공식 문서.


10
하나 더 추가하십시오. 앱에서 백그라운드 앱 목록을 연 다음 (홈 버튼을 두 번 클릭) 다시 돌아 가면 (앱의 미리보기 선택) -applicationWillEnterForeground:호출되지 않습니다 -applicationDidEnterBackground:(iOS는 다시 시작한다고 생각하지 않습니다).
kpower

@kpower 예, 그냥 내 목이 부러 졌을 것입니다 ... 결코 그런 경우 willEnterForeground가 호출되지 않을 것이라고 생각하지 않았을 것입니다 ...
TheEye

applicationWillEnterForeground:배경에서 전경까지 매번 호출 되지 않습니까 ?! applicationDidBecomeActive나중에 호출하지 않은 경우를 찾을 수 없습니다 .
Desmond DAI

정확하지 않습니다. applicationWillResignActive는 applicationDidEnterBackground :와없이 호출 할 수 있습니다
MichaelGofron

27

앱 수명주기 관리 는 질문에 도움이됩니다. 빠른 개념을 위해 해당 문서의 그림을 볼 수 있습니다. XCode 마법사가 생성 한 코드에서 주석을 읽을 수도 있습니다. 다음과 같이 나열됩니다.

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    /*
     Sent when the application is about to move from active to inactive state. 
     This can occur for certain types of temporary interruptions (such as an 
     incoming phone call or SMS message) or when the user quits the application 
     and it begins the transition to the background state.
     Use this method to pause ongoing tasks, disable timers, and throttle down 
     OpenGL ES frame rates. Games should use this method to pause the game.
     */
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    /*
     Use this method to release shared resources, save user data, invalidate 
     timers, and store enough application state information to restore your 
     application to its current state in case it is terminated later. 
     If your application supports background execution, this method is called 
     instead of applicationWillTerminate: when the user quits.
     */
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    /*
     Called as part of the transition from the background to the active state; 
     here you can undo many of the changes made on entering the background.
     */
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    /*
     Restart any tasks that were paused (or not yet started) while the 
     application was inactive. If the application was previously in the 
     background, optionally refresh the user interface.
     */
}

- (void)applicationWillTerminate:(UIApplication *)application
{
    /*
     Called when the application is about to terminate.
     Save data if appropriate.
     See also applicationDidEnterBackground:.
     */
}

자세한 설명은 UIApplicationDelegate 공식 문서를 참조하십시오


연결이 끊어졌습니다.
Phlippie Bosman

2019 년에 대한 설명과 링크를 수정하십시오.
tomjpsun

13

나는 여전히 Dano의 대답과 약간 혼동되었으므로 참조를 위해 특정 시나리오에서 이벤트 흐름을 얻기 위해 약간의 테스트를 수행했지만 도움이 될 수도 있습니다. UIApplicationExitsOnSuspendinfo.plist에서 사용하지 않는 앱을위한 것 입니다. 이것은 iOS 8 시뮬레이터에서 수행되었으며 iOS 7 장치로 확인되었습니다. Xamarin의 이벤트 핸들러 이름을 변명하십시오. 그들은 매우 비슷합니다.

  • 비 실행 상태에서 초기 및 모든 후속 실행 :

완성 된

활성화 됨

  • 중단 (전화 통화, 상단 슬라이드 다운, 하단 슬라이드 업) :
  • 홈 버튼을 두 번 눌러 비활성 앱을 표시 한 다음 앱을 다시 선택하십시오.

OnResignActivation


활성화 됨

  • 홈 버튼을 두 번 누르면 비활성 앱이 표시되고 다른 앱을 선택한 다음 앱을 다시 시작합니다.
  • 홈 버튼을 한 번 누른 다음 다시 시작하십시오.
  • 잠금 (켜기 / 끄기 버튼) 한 다음 잠금을 해제하십시오.

OnResignActivation

DidEnterBackground


WillEnterForeground

활성화 됨

  • 홈 버튼을 두 번 누르고 앱을 종료하십시오. (다음 재실행이 첫 번째입니다)

OnResignActivation

DidEnterBackground

EnterEnterBackground (iOS 7 전용?)

예, DidEnterBackgroundiOS7 기기에서는 두 번 호출됩니다. 두 번의 UIApplication 상태는 배경입니다. 그러나 iOS 8 시뮬레이터는 그렇지 않습니다. iOS 8 기기에서 테스트해야합니다. 손을 대면 답변을 업데이트하거나 다른 사람이 확인할 수 있습니다.


9

applicationWillEnterForeground 라고합니다 :

앱이 다시 시작될 때 (백그라운드에서 포 그라운드로 제공)이 메서드는 앱이 처음 시작될 때, 즉 호출 될 때 applicationDidFinishLaunch호출되지만 백그라운드에서 올 때만 호출됩니다. applicationDidBecomeActive

applicationDidBecomeActive 라는

응용 프로그램은 처음 후에 시작할 때 didFinishLaunchingapplicationWillEnterForeground처리 할 URL이없는 경우. 이후 application:handleOpenURL:가 호출됩니다. 후 applicationWillResignActive사용자 무시가 전화 또는 SMS와 같은 중단으로합니다. 응용 프로그램 어딘가에서 alertView가 사라진 후


iOS 7부터 변경되었는지 알고 있습니까? applicationWillEnterForeground에서 작업 (iOS 5/6)을하고 응용 프로그램을 처음 시작할 때 실행 한 것을 기억합니다 (오해 할 수 있음). 현재 7.1 / 8에서는 올바른 응용 프로그램입니다 .WillEnterForeground는 시작시 호출되지 않습니다.
김진영


5

iOS 8 이상에서는 전화를받는 데 미묘하지만 중요한 차이점이 있습니다.

iOS 7에서 사용자가 전화를 받으면 applicationWillResignActive :와 applicationDidEnterBackground :가 모두 호출됩니다. 그러나 iOS 8 이상에서는 applicationWillResignActive : 만 호출됩니다.


1

iOS 13+의 경우 다음 방법이 실행됩니다.

- (void)sceneWillEnterForeground:(UIScene *)scene
- (void)sceneDidBecomeActive:(UIScene *)scene
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.