[swift] Xcode 11-iOS 13에서 UISceneDelegate / SwiftUI 옵트 아웃

현재 Xcode 11 Beta 5를 사용하고 있습니다. 내 응용 프로그램 내에서 iOS 12 이하에서 제대로 실행됩니다. 그러나 iOS 13에서는 기본적으로 UIScene을 사용하는 것처럼 보입니다. 이로 인해 내 앱이 아무것도하지 않습니다.

앱이 새로 설치 될 때 실행될 때 사용자가 동의해야하는 이용 약관이 있습니다. 동의하면 로딩 화면으로 이동하여 메인 뷰로 이동합니다. 내가 게시 한 스크린 샷에서 현재 전경의보기 뒤에는 스플래시 로딩 화면이 있습니다.

조만간 애플리케이션 전반에 걸쳐 다중 뷰 씬 지원을 추가하는 방법을 살펴 보 겠지만 지금은 작업해야 할 우선 순위가 더 높습니다.

https://imgur.com/i0qLhAL

앱 대상의 일반 설정에서 “여러 창 지원”이 이미 비활성화되어 있습니다. 또한 info.plist 파일에서 Enable Multiple Windows를 NO로 설정했습니다.

지금까지는 아무것도 효과가 없었습니다. 기본적으로 iOS 10-12에서 원래 동작을 복원하기 위해 여러 창 및 UIScene / SwiftUI를 옵트 아웃 / 비활성화하고 싶습니다. iOS 13에서 가능합니까? 아니면 업데이트해야합니까?

최신 정보:

다음은 뷰 디버그 계층 구조의 스크린 샷입니다. 왼쪽은 iOS 12이고 오른쪽은 iOS 13입니다. Info.plist 나 장면 델리게이트 클래스 나 메서드에 아무것도 추가하지 않고 다른 이유는 무엇입니까? Xcode 11의 기존 프로덕션 준비 코드에서 거의 실행했습니다.

https://imgur.com/C3aLsDo



답변

앱이 iOS 13 이상에서 실행될 때 장면 사용 수용 해야 하지만 iOS 12 또는 이전 버전을 계속 지원하면서 완전히 옵트 아웃 할 수 있습니다.

  • Info.plist에서 “Application Scene Manifest”항목을 완전히 제거합니다.

  • 장면 델리게이트 클래스가 있으면 제거하십시오.

  • 앱 대리자에 장면 관련 메서드가있는 경우 해당 메서드를 제거합니다.

  • 누락 된 경우 속성 var window: UIWindow?을 앱 대리자에 추가합니다 .

이제 앱은 앱 대리자 만 사용해야하며 iOS 13에서는 iOS 12와 동일한 수명주기를 가져야합니다.

참고 :이 중 어느 것도 Swift 또는 SwiftUI에만 해당되지 않습니다.


답변

답변을 사용하여 댓글보다 더 나은 형식을 지정하십시오. (댓글을 남겨 주시면 편집하겠습니다.)

이것은 내가 직면 한 문제이며 여기에 몇 가지 시나리오가 있습니다.

  • Xcode 11 의 기존UIKit 앱에서 작업하려면 간단히 열면 정상적으로 작동합니다. 내 모든 애플 리케이션과 함께,이 어떤 SceneDelegate 파일도를 변경 AppDelegate또는 스토리 보드.
  • iOS 13을 대상으로 하는 UIKIT 을 만들려면 “SwiftUI 사용”확인란을 선택하지 않은 상태에서 만들기 만하면됩니다.

하지만 저는 여러분이 세 번째 시나리오에 직면하고 있는지 궁금합니다. 제가 약 1 주일 전에 한 시나리오입니다. iOS 13 이전 버전을 대상으로 하는 새로운`UIKit 앱 만들기 . (실제로 iOS 9를 타겟팅했습니다!)

예, 템플릿은 SceneDelegate파일 / 클래스 와 함께 15 개의 오류 (베타 5 기준)를 제공합니다 . 다행히 Xcode는 하나를 제외한 모든 것을 자동 수정하는 데 도움이됩니다.

마지막은 SceneDelegate클래스의 일부인 한 줄을 추가하는 것입니다. 하지만 불행히도 Apple 은 클래스에서 제외했습니다 AppDelegate. 12 개 이상의 @available(iOS 13.0, *)절 이후에 SceneDelegateiOS 12를 실행 하는 경우 옵트 아웃했고 무엇을 추측할까요? 그건 아니 거기 ApDelegate!

이것을 AppDelegate에 추가하십시오.

var window: UIWindow?

이 시점에서 UIKitiOS 12 및 이전 버전을 대상으로 하는 실행중인 앱 이 있어야합니다 .


답변

좋아 그래서 알아 냈어. Apple의 새로운 기본 카드 프레젠테이션 스타일의 iOS 13 변경으로 인해 스토리 보드에서 스플래시 화면에서 사용자 지정 흐름 탐색 컨트롤러로 기본적으로 새 프레젠테이션이 설정되었습니다 (아래 스크린 샷 참조).

Segue

내가 그것을 고친 방법은 이전 수명주기를 기본으로 한 이전 스타일로 돌아가는 것이 었습니다. 아래 스크린 샷을 참조하십시오.

스토리 보드 속편 종류

왜 그랬는지 잘 모르겠습니다. 내 애플리케이션에서이 문제를 일으킨 유일한 장소 였기 때문입니다 (꽤 큰 앱이므로 확인하기 위해 모든 스토리 보드를 살펴 보는 데 시간을 할애해야합니다).


답변

dfd의 답변을 사용하여이 작업을 수행했지만 내 앱이 Objective-C에 있기 때문에 한 가지 변경해야했습니다.

Objective-C에서는

@property (strong, nonatomic) UIWindow *window;

AppDelegate.h (.m이 아님)


답변

Xcode 11-Swift 5.3

엑스 코드 (11) 이후 및 및 스위프트 5.3의 도움으로 @main, 당신은 어떤이있는 다중 응용 프로그램 할 수 있습니다 SceneDelegate또는 이벤트를 AppDelegate. 다음과 같은 간단한 파일 만 있습니다.

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}


답변