EA showBluetoothAccessoryPicker 未在 SwiftUI 中显示

Posted

技术标签:

【中文标题】EA showBluetoothAccessoryPicker 未在 SwiftUI 中显示【英文标题】:EA showBluetoothAccessoryPicker not showing in SwiftUI 【发布时间】:2021-09-20 18:48:19 【问题描述】:

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

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

到目前为止我所尝试的:

我已读到您需要使用应用委托

var window: UIWin

正确设置以查看选择器窗口。所以我创建了一个类

class AppDelegate: UIApplicationDelegate

    var window: UIWindow?

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

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

不过,当我调用 showBluetoothAccessoryPicker 时,选择器窗口没有显示。

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

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 的工作演示应用程序的输出相匹配。只是选择器窗口没有显示。

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

提前感谢您的帮助。

【问题讨论】:

在这里遇到同样的问题...您找到解决方法了吗?您是否通过反馈报告器报告了问题? 我没有找到基于 SwiftUI 的应用程序的解决方案。我最终放弃并切换到 UIKit 应用程序。这不是直接开箱即用的,还需要一些修改才能开始工作。当我再次访问时,我会更新该信息。 那太酷了!我现在可以看到选择器,但它是空的……尽管我的所有信息都是正确的,并且我可以与 EA 交谈。所以肯定还少了点什么。 如果你能看到选择器,那么它正在工作。您可能需要验证您的协议是否包含在 Info.plist 的 Supported External Accessory Protocols 中。 我知道,但一切都是正确的。如果它不在 plist 中,我一开始就无法连接并与 EA 对话。恐怕这是选择器中的错误。 【参考方案1】:

更新:它在 UIKit 中也被破坏了!

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

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

旧答案:

它现在在 SwiftUI 中被破坏了。

进一步的实验表明EAExternalAccessory 选择器似乎在查询UIApplicationDelegatewindow 属性以找出将其显示在何处。

唉,这是一个optional 属性,它没有在SwiftUI 的AppDelegate 版本中实现,它只会得到nil 并且不会显示出来。

在这种情况下,@UIApplicationDelegateAdaptor 方法似乎也不起作用,因为它并没有真正充当 real 应用程序委托的替代品,而是将方法转发。

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

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

请打开错误报告。

【讨论】:

以上是关于EA showBluetoothAccessoryPicker 未在 SwiftUI 中显示的主要内容,如果未能解决你的问题,请参考以下文章

ea画时序图怎么变成两条

为什么EA在STP模式下能够获利?

大数据EA---收官了,再聊大数据EA的原理

ea的顺序图的返回虚线怎么画

带有ea的单词

[新增EA028高压注射器]24套UML+EA和StarUML的建模示范视频-全程字幕(2022.7.4更新)