镜像时显示外部窗口 (SwiftUI)

Jac*_*vin 5 ios swift swiftui

我正在我的 iPhone/iPad 应用程序中实现一项功能,当 iPhone 连接到外部显示器时,iPhone 充当控制器,外部显示器显示非交互式视图。我正在使用 SwiftUI。

\n

我的应用程序实际上与 Apple 文档中的概念非常相似。iPhone/iPad 将始终用作控制器,而外部显示器将始终显示内容,就 Apple 而言,是游戏。因此,将游戏镜像到 QuickTime 或 StreamLabs 时,需要镜像实际游戏,而不是控制器。这是我在 Apple 文档中讨论的示例,以便您可以直观地看到它。

\n

来源:苹果

\n

目前的实施

\n

以下是我SceneDelegate按照 Apple文档在 中实现它的方法。

\n
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {\n    guard let windowScene = scene as? UIWindowScene else { return }\n    if session.role == .windowApplication {\n        let window = UIWindow(windowScene: windowScene)\n        window.rootViewController = UIHostingController(rootView: ContentView())\n        window.makeKeyAndVisible()\n    }\n    \n    if session.role == .windowExternalDisplayNonInteractive {\n        let window = UIWindow(windowScene: windowScene)\n        window.rootViewController = UIHostingController(rootView: ExternalView())\n        window.makeKeyAndVisible()\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

其中,当然ContentView应该是在iPhone上显示,而ExternalView在外接显示器或QuickTime上显示。info.plist如果这与您相关的话,这是我的条目。

\n

包含 Windows 条目的 info.plist

\n

结果和问题

\n

好的,这在大多数情况下都可以正常工作,例如使用 AirPlay 将屏幕从 iPhone 镜像到电视时。两个视图均正确显示。不过,我遇到的问题是,在某些情况下,例如尝试使用 iPhone 作为源在 QuickTime 中录制电影,或者将 iPhone 添加为 StreamLabs(iPhone 屏幕)中的视频捕获设备(与ContentView) 被镜像,而不是显示ExternalView. 使用这些应用程序时需要ExternalView 显示。

\n

查看时UIApplication.shared.openSessions,仅列出一个会话,如下所述

\n
\xe2\x96\xbf 1 member\n  - <UISceneSession: 0x283594ac0; role: UIWindowSceneSessionRoleApplication; persistentIdentifier: ED82F2B9-17EC-435F-8E20-439CECCA92F6> {\n    scene = <UIWindowScene: 0x117d051e0>;\n    configuration = <UISceneConfiguration: 0x283595cc0; name: ContentView; role: UIWindowSceneSessionRoleApplication> {\n        sceneClass = 0x0;\n        delegateClass = SwiftUI.AppSceneDelegate;\n        storyboard = 0x0;\n    };\n} #0\n    - super: NSObject\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法“创建”新的屏幕镜像会话?我开始担心像 QuickTime 和 StreamLabs 这样的应用程序不可能实现这一点,而且我也无法解决这个问题。

\n

无论如何,如果您对这个问题有任何解决方案,我将非常感谢任何反馈。

\n

小智 1

遗憾的是,据我所知,这还不可能。我对此进行了很多研究,希望有人证明我错了。

没有屏幕镜像或录制应用程序支持录制第二个显示器。

您可以镜像到您的 Mac 或 PC(使用Reflector并从那里进行录制),或者使用 Elgato Game Capture HD60s 等采集卡以及LightningUSB-C适配器走硬件路线,然后从您的 PC 上传输游戏内容。

如果您希望让您的游戏可以流式传输,那么这对您没有帮助。