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
选择器似乎查询 UIApplicationDelegate
的 window
属性 以找出显示自己的位置。
唉,那是一个 optional
属性,在 AppDelegate
的 SwiftUI 版本中没有实现,它只得到 nil
而没有显示.
似乎 @UIApplicationDelegateAdaptor
方法在这种情况下不起作用,因为它并没有真正充当 real 应用程序的 stand-in委托,而是获取转发的方法。
解决此问题的一种方法是使用 UIKit
应用程序生命周期并通过 UIHostingController
.
呈现您的 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
选择器似乎查询 UIApplicationDelegate
的 window
属性 以找出显示自己的位置。
唉,那是一个 optional
属性,在 AppDelegate
的 SwiftUI 版本中没有实现,它只得到 nil
而没有显示.
似乎 @UIApplicationDelegateAdaptor
方法在这种情况下不起作用,因为它并没有真正充当 real 应用程序的 stand-in委托,而是获取转发的方法。
解决此问题的一种方法是使用 UIKit
应用程序生命周期并通过 UIHostingController
.
可能也可以通过方法调配来破解它,但如果是这样,我不知道如何实现。
请打开错误报告。