iOS 15 UIWindowScene не работает должным образом

#ios #swift #xcode #carplay #uiwindowscene

Вопрос:

Я хотел создать приложение для CarPlay, к сожалению, из-за отсутствия учебных пособий мне трудно даже создать приложение без какой-либо функциональности. Проблема возникает, когда я хочу запустить приложение, и оно указывает на файл AppDelegate.swift. Кроме того, у меня есть права, установленные, так что это должно быть хорошо. Как я могу решить эту проблему?

У меня проблема с UIWindowScene (на мой взгляд).

AppDelegate

 import UIKit
import CoreData
import CarPlay

@main
class AppDelegate: UIResponder, UIApplicationDelegate {
    
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        // Override point for customization after application launch.
        return true
    }

    // MARK: UISceneSession Lifecycle
    @available(iOS 13.0, *)
    func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
        
        return UISceneConfiguration(name: "CarPlay", sessionRole: connectingSceneSession.role)
    }
    
    func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
 
    }

    // MARK: - Core Data stack

    lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "ev")
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                 
                fatalError("Unresolved error (error), (error.userInfo)")
            }
        })
        return container
    }()

    // MARK: - Core Data Saving support

    func saveContext () {
        let context = persistentContainer.viewContext
        if context.hasChanges {
            do {
                try context.save()
            } catch {
                let nserror = error as NSError
                fatalError("Unresolved error (nserror), (nserror.userInfo)")
            }
        }
    }

}
 

SceneDelegate

 import UIKit
import CarPlay

@available(iOS 13.0, *)
class CarPlaySceneDelegate: UIResponder, UIWindowSceneDelegate, CPTemplateApplicationSceneDelegate {

    var interfaceController: CPInterfaceController?
    
    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        guard let _ = (scene as? UIWindowScene) else { return }
    }
    
    func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene,
        didConnect interfaceController: CPInterfaceController) {
        
        self.interfaceController = interfaceController
        
        let tabExample1 = CPListItem(text: "Example Column 1", detailText: "Example 1")
        let tabExample2 = CPListItem(text: "Example Column 2", detailText: "Example 2")
        let tabExample3 = CPListItem(text: "Example Column 3", detailText: "Example 3")
        let tabExample4 = CPListItem(text: "Example Column 4", detailText: "Example 4")
        
        let selectionItemsA = CPListSection(items: [tabExample1, tabExample2, tabExample3, tabExample4])
        let selectionItemsB = CPListSection(items: [tabExample1, tabExample3])
        
        let listTemplate = CPListTemplate(title: "", sections: [selectionItemsA])
        let listTemplateA = CPListTemplate(title: "", sections: [selectionItemsB])
        let listTemplateB = CPListTemplate(title: "", sections: [selectionItemsA])
        let listTemplateC = CPListTemplate(title: "", sections: [selectionItemsB])
        
        let tabA: CPListTemplate = listTemplate
        tabA.tabSystemItem = .favorites
        tabA.showsTabBadge = false
        
        let tabB: CPListTemplate = listTemplateA
        tabA.tabSystemItem = .mostRecent
        tabA.showsTabBadge = true
        
        let tabC: CPListTemplate = listTemplateB
        tabA.tabSystemItem = .history
        tabA.showsTabBadge = false
        
        let tabD: CPListTemplate = listTemplateC
        tabA.tabSystemItem = .search
        tabA.showsTabBadge = false
        
        let tabBarTemplate = CPTabBarTemplate(templates: [tabA, tabB, tabC, tabD])
        self.interfaceController?.setRootTemplate(tabBarTemplate, animated: true, completion: {_, _ in })
    }
    
    private func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene, didDisconnect interfaceController: CPInterfaceController) {
        self.interfaceController = nil
    }

    func sceneDidDisconnect(_ scene: UIScene) {

    }

    func sceneDidBecomeActive(_ scene: UIScene) {

    }

    func sceneWillResignActive(_ scene: UIScene) {

    }

    func sceneWillEnterForeground(_ scene: UIScene) {

    }

    func sceneDidEnterBackground(_ scene: UIScene) {
        (UIApplication.shared.delegate as? AppDelegate)?.saveContext()
    }

}
 

Info.plist

 <?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>UIApplicationSceneManifest</key>
    <dict>
        <key>UIApplicationSupportsMultipleScenes</key>
        <true/>
        <key>UISceneConfigurations</key>
        <dict>
            <key>UIWindowSceneSessionRoleApplication</key>
            <array>
                <dict>
                    <key>UISceneClassName</key>
                    <string>CPTemplateApplicationScene</string>
                    <key>UISceneConfigurationName</key>
                    <string>CarPlay</string>
                    <key>UISceneDelegateClassName</key>
                    <string>$(PRODUCT_MODULE_NAME).CarPlaySceneDelegate</string>
                    <key>UISceneStoryboardFile</key>
                    <string>Main</string>
                </dict>
            </array>
        </dict>
    </dict>
</dict>
</plist>
 

Ошибка

 2021-10-06 12:16:22.750526 0200 ev[70981:3711041] *** Assertion failure in  [UIScene _sceneForFBSScene:create:withSession:connectionOptions:], UIScene.m:1148
2021-10-06 12:16:22.754761 0200 ev[70981:3711041] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'description specified a class of CPTemplateApplicationScene, but systemType UIWindowSceneSessionRoleApplication requires a minimum class of UIWindowScene'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff203fbbb4 __exceptionPreprocess   242
    1   libobjc.A.dylib                     0x00007fff2019ebe7 objc_exception_throw   48
    2   Foundation                          0x00007fff20750c12 _userInfoForFileAndLine   0
    3   UIKitCore                           0x00007fff24387096  [UIScene _sceneForFBSScene:create:withSession:connectionOptions:]   2284
    4   UIKitCore                           0x00007fff24ffd75c -[UIApplication _connectUISceneFromFBSScene:transitionContext:]   1253
    5   UIKitCore                           0x00007fff24ffdc0b -[UIApplication workspace:didCreateScene:withTransitionContext:completion:]   289
    6   UIKitCore                           0x00007fff24a7e62e -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:]   358
    7   FrontBoardServices                  0x00007fff26483d98 -[FBSScene _callOutQueue_agent_didCreateWithTransitionContext:completion:]   419
    8   FrontBoardServices                  0x00007fff264b04a3 __94-[FBSWorkspaceScenesClient createWithSceneID:groupID:parameters:transitionContext:completion:]_block_invoke.180   102
    9   FrontBoardServices                  0x00007fff2649221a -[FBSWorkspace _calloutQueue_executeCalloutFromSource:withBlock:]   209
    10  FrontBoardServices                  0x00007fff264b0082 __94-[FBSWorkspaceScenesClient createWithSceneID:groupID:parameters:transitionContext:completion:]_block_invoke   352
    11  libdispatch.dylib                   0x000000010b3e7c0c _dispatch_client_callout   8
    12  libdispatch.dylib                   0x000000010b3eab7f _dispatch_block_invoke_direct   295
    13  FrontBoardServices                  0x00007fff264d6dc8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__   30
    14  FrontBoardServices                  0x00007fff264d6cbe -[FBSSerialQueue _targetQueue_performNextIfPossible]   174
    15  FrontBoardServices                  0x00007fff264d6df0 -[FBSSerialQueue _performNextFromRunLoopSource]   19
    16  CoreFoundation                      0x00007fff20369e25 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__   17
    17  CoreFoundation                      0x00007fff20369d1d __CFRunLoopDoSource0   180
    18  CoreFoundation                      0x00007fff20369254 __CFRunLoopDoSources0   340
    19  CoreFoundation                      0x00007fff20363951 __CFRunLoopRun   875
    20  CoreFoundation                      0x00007fff20363103 CFRunLoopRunSpecific   567
    21  GraphicsServices                    0x00007fff2c851cd3 GSEventRunModal   139
    22  UIKitCore                           0x00007fff24ffbe63 -[UIApplication _run]   928
    23  UIKitCore                           0x00007fff25000a53 UIApplicationMain   101
    24  libswiftUIKit.dylib                 0x00007fff5933d052 $s5UIKit17UIApplicationMainys5Int32VAD_SpySpys4Int8VGGSgSSSgAJtF   98
    25  ev                                  0x000000010b23cff8 $sSo21UIApplicationDelegateP5UIKitE4mainyyFZ   104
    26  ev                                  0x000000010b23cf87 $s2ev11AppDelegateC5$mainyyFZ   39
    27  ev                                  0x000000010b23d108 main   24
    28  dyld                                0x000000010b264e1e start_sim   10
    29  ???                                 0x0000000000000001 0x0   1
)
libc  abi: terminating with uncaught exception of type NSException
dyld4 config: DYLD_ROOT_PATH=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot DYLD_LIBRARY_PATH=/Users/coder/Library/Developer/Xcode/DerivedData/ev-gwuzkianekeqfaeltofdzmkuwodt/Build/Products/Debug-iphonesimulator:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/system/introspection DYLD_INSERT_LIBRARIES=/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libBacktraceRecording.dylib:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/usr/lib/libMainThreadChecker.dylib:/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/CoreSimulator/Profiles/Runtimes/iOS.simruntime/Contents/Resources/RuntimeRoot/Developer/Library/PrivateFrameworks/DTDDISupport.framework/libViewDebuggerSupport.dylib DYLD_FRAMEWORK_PATH=/Users/coder/Library/Developer/Xcode/DerivedData/ev-gwuzkianekeqfaeltofdzmkuwodt/Build/Products/Debug-iphonesimulator
*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'description specified a class of CPTemplateApplicationScene, but systemType UIWindowSceneSessionRoleApplication requires a minimum class of UIWindowScene'
terminating with uncaught exception of type NSException
CoreSimulator 776.3 - Device: iPhone 11 (C3E67DA4-1F53-4110-B71D-41CA3646326D) - Runtime: iOS 15.0 (19A339) - DeviceType: iPhone 11
(lldb) 
 

Комментарии:

1. В чем заключается ваш вопрос? Или это тоже вопрос?

2. У меня есть ошибка, которую я не могу понять, как исправить

3. Вы можете помочь себе, указав, под какой версией iOS вы запускаете свое приложение и тестируете ли вы его на реальном устройстве или на симуляторе.

4. Я понимаю. Вы тестируете его под iOS 15 с помощью симулятора.

5. Я использую актуальную версию iOS и тестирую ее на симуляторе. После запуска приложения на симуляторе оно мгновенно вылетает. Ошибки сборки нет.

Ответ №1:

Так что, очевидно, я допустил ошибку, когда создавал info.plist

Когда я заменил «UIWindowSceneSessionRoleApplication» на «CPTemplateApplicationSceneSessionRoleApplication», он загрузился, и все выглядит нормально