[SwiftUI] SceneDelegate를 지우고 ApplicationDelegate로 만드십시오.

3498 단어 XcodeiOSSwiftSwiftUI

이것은 무엇입니까?



iOS 13 환경에서 ReplayKit & UIScene의 궁합이 나쁘기 때문에, 울고 울고 있는 UISceneDelegate를 지워 UIApplicationDelegate만 했을 때의 메모입니다.

ReplayKit & UIScene: Assertion when calling RPSystemBroadcastPickerView · Issue #438 · twilio/video-quickstart-ios

If you must use RPSystemBroadcastPickerView then you should consider not using UIScene, and going back to UIApplicationDelegate.

했던 일



SceneDelegate 버서리 삭제



Info.plist에서 UIApplicationSceneManifest를 버서리 제거합니다.



그 후, SceneDelegate.swift 도 불필요하게 되므로 삭제합니다. (SceneDelegate에서 했던 적이 있다면 AppDelegate로 마이그레이션해야 함)

AppDelegate에서 UIHostingController를 통해 SwiftUI의 View 열기



AppDelegate.swift를 다음과 같이 다시 작성합니다.
import UIKit
import SwiftUI

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        window = UIWindow(frame: UIScreen.main.bounds)
        window!.rootViewController = UIHostingController(rootView: ContentView)
        window!.makeKeyAndVisible()

        return true
    }
}

이 때, func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
와 같은 UISceneSession Lifecycle 가 남아 있으면 잘 앱이 움직이지 않기 때문에 주의입니다.

이제 일단 앱이 시작되지만 동작을 보장하지는 않습니다. 어디까지나 자기 책임으로!

좋은 웹페이지 즐겨찾기