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


106

현재 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 13 및 iOS 12를 지원해야합니까?
rmaddy

iOS 11-13 이상 (향후 버전) 간의 @rmaddy 지원.
DavidA

코드 또는 스토리 보드를 통한 기본 UI입니까?
rmaddy

@rmaddy 스토리 보드에서 수행되는 작업에는 참조 된 xib ViewController에 대한 segue가 있습니다.
DavidA

앱이 수행하는 작업과시기에 대한 구체적인 세부 정보 없이는 말하기가 어렵습니다. viewWill|DidAppear예를 들어 제시된 뷰 컨트롤러를 닫을 때 와 같은 뷰 컨트롤러 메서드 는 iOS 13에서 동일하게 호출되지 않습니다. 많은 수명주기 디버깅 메시지와 중단 점을 추가하고 iOS 12와 13 사이의 흐름을 비교하고 차이점을 확인하세요.
rmaddy

답변:


299

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

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

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

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

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

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

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


동시에 답변을 게시했습니다. :-) 하나의 질문- AppDelegate내가 언급 한 그 누락 된 줄 . 설명하신이 과정에서 자동으로 돌아 오나요? (나는 장면을 완전히 무시하기 때문에 귀하의 답변이 더 좋습니다.)
dfd

1
나에게도 똑같은 일이 일어나고 내 Info.plist에 매니페스트 항목이 없으며 AppDelegate 메서드도 없으며 SceneDelegate 클래스도 없습니다. David에 대한 "이용 약관"과 같은 컨트롤러를 rootViewController로 설정하고 있으며 위의 질문에 표시된 것과 동일하게 나타납니다. 이 UI 결함에 갇혀서 앞으로 나아갈 수 없으니 도와주세요. 으!
Mohsin Khubaib Ahmed

1
@MohsinKhubaibAhmed 완전히 다른 문제에 대해 질문하고 있습니다. stackoverflow.com/questions/56435510/…
rmaddy

1
안녕! 3 단계 안내를 따랐지만 시작 화면이 나타난 후 검은 색 화면이 나타납니다. 메인 스토리 보드와 초기 뷰 컨트롤러가 선택됩니다. 의견 있으십니까?
user3191334 2011

1
@ user3191334 나도 검은 화면이 생겼습니다. 제 경우에는 기본 검정색 배경을 제공하는 어두운 모드였습니다. 기본 스토리 보드에 일부 콘텐츠를 추가하면 모두 표시됩니다.
Gordon Dove

40

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

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

  • 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 및 이전 버전을 대상으로 하는 실행중인 앱 이 있어야합니다 .


감사합니다. 내 시나리오는 Xcode 11의 기존 UIKit 앱이라고 말한 첫 번째 요점입니다.하지만이 앱을 열면 제대로 작동하지 않습니다. 뷰 디버그 계층 구조에 추가 한 업데이트를보십시오.
DavidA

또한 AppDelegate에는 이미 var window : UIWindow?
DavidA

당신은 나를 걱정했습니다! (그리고 여전히 약간 걱정됩니다.) 기존 앱에 대한 업데이트가 거의 없었습니다. 지난 주에는 SwiftUI에 대한 불만이 있었고 iOS 13 용 UIKit에서만 레이아웃을 시도하는 것이 궁금했습니다. 하지만 내 기존 앱? 그들은 iPad 멀티 태스킹을 지원하지만 Xcode 11에서 변경되지 않은 채로 남아 있습니다. 내가 가지고 있지 않은 SceneDelegate테스트는 (a) iOS 13에서 작동하며 (b) 여러 창을 전혀 지원하지 않으며 두 앱 사이의 분할보기입니다. (저는 또한 드래그 앤 드롭을 지원하지 않습니다.) 다른 일이 진행되고 있습니까?
dfd

반복하기 위해 Xcode 11에서 Xcode 10 앱을 열었습니다. 아니요 SceneDelegate, 아니요 SwiftUI, iOS 9+ 앱의 여러 인스턴스를 만들 수 없습니다. 성능은 항상 동일합니다. 모든 기능은 CoreImage실시간으로 업데이트되는 사용자 지정 필터입니다. 뷰 계층 구조의 장면과 관련된 일부 OS 관련 균열이 있으면 장면을 지원하지 않으면 문제가 있습니다. (그리고 끝내기 위해, 예, 저는 여전히 약간 걱정이됩니다.하지만 베타 5이기도합니다.) 제가보고있는 것을 재현 할 수있는 좋은 백업이 있기를 바랍니다.
dfd

감사. 나는 그것이 수명주기 내에서 무언가를 의심합니다. 내 애플리케이션을 디버깅하는 데 시간을 할애하겠습니다. 내가 비슷한 상황에서 누군가 도움을 알아낼 때마다 나는이 업데이트됩니다
DavidA

4

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

Segue

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

스토리 보드 속편 종류

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


2
귀하의 질문은 장면 사용을 거부하는 방법을 묻습니다. 이 답변은 장면 선택 해제에 대한 해결책을 제공하지 않습니다. 이것은 받아 들여진 대답이되어서는 안됩니다. 당신이하고 싶었던 모든 것이 새로운 카드 스타일의 프리젠 테이션을 피하는 것이라면, 당신은 그 질문을 다루는 여러 중복 된 답을 찾을 수있을 것입니다.
rmaddy

4

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

Objective-C에서는

@property (strong, nonatomic) UIWindow *window;

AppDelegate.h (.m이 아님)


2

Xcode 11-Swift 5.3

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

import SwiftUI

@main
struct MyMultiPlatformApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.