UIApplicationDelegate 메서드`application (_ : configurationForConnecting : options :)`이 안정적으로 호출되지 않는 이유

Aug 21 2020

발행물:

AppDelegate 메서드와 관련하여 예상치 못한 동작이 application(_:configurationForConnecting:options:)있습니다.

문서는 다음과 같이 설명합니다.

UIKit은 새 장면을 만들기 직전에이 메서드를 호출합니다.

나는 앱이 시작될 때마다 이것이 사실이라고 기대합니다.
내가 그러나 모든 후속 출시를 위해, 처음으로 내 응용 프로그램을 실행하면 방법은 사실이라고, 그것을하지 않습니다 .

낳다:

재현 할 수있는 매우 간단한 테스트 케이스가 있습니다.

  • Xcode 12> 새 프로젝트 만들기> iOS> 앱 (UIKit / Storyboard)
  • 다음 AppDelegate과 같이 메서드에 디버깅 문을 추가합니다 .
      // from Apple's sample project:
      func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
          // Called when a new scene session is being created.
          // Use this method to select a configuration to create the new scene with.
          print("I was called!").  // <--- debugging statement
          return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
      }
    
  • 앱 실행> "내가 불렀어!" 콘솔에 인쇄됩니다
  • 앱을 다시 실행하면 아무것도 인쇄되지 않습니다.

질문:

application(_:configurationForConnecting:options:)두 번째 출시에서 호출되지 않는 이유는 무엇 입니까?
(예상되는 동작입니까, 그렇다면 이유 / Apple의 버그입니까)

답변

3 Adrian Oct 21 2020 at 05:10

이것은 예상되는 동작으로 보이며, 무슨 일이 일어나고 있는지 이해하면 의미가 있지만 문서화되지 않았습니다. 나는 그것의 바닥에 이르기까지 상당히 충격적인 시간을 보냈습니다. 아, 애플.

알아야 할 핵심 사항은 앱을 다시 시작하면 이전 실행의 창이 복원된다는 것입니다.

(또한 앱에 여러 유형의 창 (각각 장면 구성으로 표시됨)이있을 수 있다는 점을 기억하는 데 도움이됩니다. 이것이이 대리자 메서드를 처음에 구현할 수있는 이유입니다.

사례 1 : 최초의 앱 출시

앱은 창에 어떤 유형의 장면을 넣을지 알지 못하며 알아 application(_:configurationForConnecting:options:)내기 위해 호출 합니다. 지금까지 우리가 예상 한대로입니다. (이 델리게이트 메서드를 구현하지 않으면 Info.plist의 씬 매니페스트 에있는 첫 번째 적합한 항목 (있는 경우)으로 대체됩니다.)

사례 2 : 새 창 생성 (여러 창을 지원하는 앱의 경우)

(예 : iPad에서 독 아이콘을 드래그하여). 앱은이 창에 무엇을 넣을지 모릅니다. 사례 1과 동일합니다.

사례 3 : 앱이 다시 시작됨

OS에서 창을 복원하려고합니다. 이를 위해 지난번에 열었던 창의 장면 구성을 기억했습니다. 놀라다! 창에 넣을 장면을 알고 앱 대리인에게 묻지 않습니다. 계속 진행하여 기억 된 구성을 사용하여 장면을 만듭니다.

앱이 시작될 때 생성되는 창이라는 관점에서 생각하는 열악한 개발자에게는 혼란 스럽습니다. 그러나 시작할 때 복원되는 창을 생각하면 생성되지 않고 창이 하나 뿐인 경우에도 의미가 있습니다.


이제 창을 잊고 다음 실행시 델리게이트 메소드가 호출되도록 재설정하려면 다음을 수행하십시오.

  • iOS의 경우 앱 삭제
  • Catalyst의 경우 앱의 컨테이너를 삭제합니다.

참고 1 : Catalyst에서는 재실행시 첫 번째 창만 복원되는 것으로 보이지만 그렇지 않은 경우 동작은 위와 동일합니다. 이제 이것이 사실이 아닌 것으로 관찰했습니다. 아마도 일관성이 없을 것입니다.

2 주 : 당신은 또한 당신의 창 '복원 할 수 있습니다 내용을 뿐 아니라 자신의, 유형 사용 UIWindowSceneDelegate하고 UISceneSession.stateRestorationActivity,하지만 그건 또 다른 이야기입니다.