EA showBluetoothAccessoryPicker 未在 SwiftUI 中显示

EA showBluetoothAccessoryPicker not showing in SwiftUI

我创建了一个需要连接到外部附件的小程序。我已经能够使用 UIKit 和 EA 框架成功地做到这一点。

我遇到的问题是我有一个基于 SwiftUI 的应用程序需要使用外部附件,但是当我调用 showBluetoothAccessoryPicker 函数时,选择器 window 没有显示。

到目前为止我尝试过的:

我了解到您需要使用

进行应用委托

var window: UIWin

正确设置以查看选择器 window。所以我创建了一个 class

class AppDelegate: UIApplicationDelegate
{
    var window: UIWindow?
}

然后我将应用委托与我的 swiftui“应用”结构相关联,如下所示:

@main
struct POC: App {
    @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate
    
    var body: some Scene {
        WindowGroup {
            TabSelectionView()
        }
    }
}

然而,当我调用 showBluetoothAccessoryPicker 时,选择器 window 没有显示。

我在输出日志中看到以下内容:

2021-09-20 13:16:31.804796-0500 POC[2150:1514447] IAPDHasLaunched: kIAPAvailableNotification iapdAvailableState 0 -> 0
2021-09-20 13:16:31.805791-0500 POC[2150:1514447] IAP2DHasLaunched: kIAP2AvailableNotification iap2dAvailableState 0 -> 0
2021-09-20 13:16:31.807219-0500 POC[2150:1514447] -[EAAccessoryManager _initFromSingletonCreationMethod] isRunningOnMac

此日志显示正确并且与使用 UIKit 的工作演示应用程序的输出匹配。只是选择器window没有显示。

有人知道需要做什么才能让选择器 window 正确显示 SwiftUI 应用程序吗?是否有任何 SwiftUI 连接到外部附件的示例,任何人都可以向我指出?

在此先感谢您的帮助。

更新:它在 UIKit 中也有问题!

显然,新的基于 UIScene 的机制将其杀死(并且由于 SwiftUI 基于新的 scene-based 机制,它看起来只是 SwiftUI 的问题)。

如果您回滚到基于 UIApplicationDelegate 的生命周期,它会再次运行。

旧答案:

它现在刚刚在 SwiftUI 中出现问题。

进一步的实验表明 EAExternalAccessory 选择器似乎查询 UIApplicationDelegatewindow 属性 以找出显示自己的位置。

唉,那是一个 optional 属性,在 AppDelegate 的 SwiftUI 版本中没有实现,它只得到 nil 而没有显示.

似乎 @UIApplicationDelegateAdaptor 方法在这种情况下不起作用,因为它并没有真正充当 real 应用程序的 stand-in委托,而是获取转发的方法。

解决此问题的一种方法是使用 UIKit 应用程序生命周期并通过 UIHostingController.

呈现您的 SwiftUI 应用程序

可能也可以通过方法调配来破解它,但如果是这样,我不知道如何实现。

请打开错误报告。