gpt4 book ai didi

ios - 任何 Core MIDI 调用都会导致应用程序无响应

转载 作者:可可西里 更新时间:2023-11-01 05:42:45 25 4
gpt4 key购买 nike

我在使用的几个 iOS 应用程序以及从 App Store 下载的另一个应用程序中遇到了 Core MIDI 问题。

似乎 发生的是 Core MIDI 服务器崩溃。发生这种情况后,与核心 MIDI 函数或属性的任何交互都会使调用应用程序无响应。以下行位于 AppDelegate 的 didFinishLaunchingWithOptions::

[MIDINetworkSession defaultSession].enabled = YES;

执行在此时停止,导致调试时永远挂起或 #8badf00d 否则崩溃。

即使 Core MIDI 函数应该返回一个 OSStatus,也会发生这种情况——返回值永远不会回来:

OSStatus s = MIDIObjectGetStringProperty(ref, kMIDIPropertyDisplayName, (CFStringRef*)&string);

此调用(在 PGMidi 库中)也挂起,s 未返回。解决此问题的唯一方法是重新启动设备。

核心 MIDI 服务器变得无响应似乎与从连接的 Mac 运行多个网络 session 有关,但我无法确定可靠复制的方法。除了我自己的应用程序(使用 MIKMIDI 库),我还遇到过从 App Store 下载的 midimittr 无响应行为。

当然,我无法控制 Core MIDI 服务器是否变得无响应。但是有没有一种方法可以在进行可能使我的应用程序无响应的调用之前检查 MIDI 服务器的状态?


更新:2019-05-10

我发现我可以通过以下步骤让 iOS Core MIDI 服务器进入这种无响应状态:

  1. 在 Mac 上的音频/MIDI 设置中设置网络 MIDI session 。
  2. 在 iOS 应用中,连接到该网络 MIDI session 。
  3. 让 Mac 自然进入休眠状态(从 Apple 菜单调用 sleep 似乎不会触发问题)。
  4. Mac 进入休眠状态后,在 iOS 应用程序中执行一些调用 Core MIDI 的操作。

所以这就像 iOS Core MIDI 服务器失去了与 Mac 的 MIDI 网络的连接,但继续尝试和执行。


更新:2019-05-17

Apple 回复了我的错误报告 (#50657978),称它与另一份报告 (#49583498) 重复,将被关闭。至少他们知道这个错误。


更新:2019-07-17

通过 Audio Music Setup 连接 Core MIDI 网络,然后在 iOS 设备上将您的应用设置为后台并打开飞行模式,也可以更快地进入此 Core MIDI 挂起状态(用于调试目的)。

最佳答案

请参阅下面的最新更新和最终解决方案


我已经想出了一个部分解决这个问题的方法。 (唉,因为根本原因似乎嵌入在 Apple 的代码中,所以不可能有完整的解决方案。)

在我的 AppDelegate 中,我现在运行一个例程,它可以检测对 Core MIDI 的调用是否会超时:

func enableMIDINetworkSession() {
let midiNetworkGroup = DispatchGroup()

midiNetworkGroup.enter()
DispatchQueue.global(qos: .background).async {
MIDINetworkSession.default().isEnabled = true
midiNetworkGroup.leave()
}

// If `midiNetworkGroup.leave()` is not reached in the closure above, then the result below will be `.timeOut`
let midiNetworkTimeoutResult = midiNetworkGroup.wait(timeout: DispatchTime.now() + 10.0)

switch midiNetworkTimeoutResult {
case .timedOut:
{ ... } // Calls to Core MIDI will cause app to hang. Handle as required. Note: app will crash anyway at some point in the future.

case .success:
break // All good, continue as before
}
}

这里要注意一点:如果您打算在 midiNetworkTimeoutResult == .timeOut 的情况下显示警报,请记住,在此之后立即发生的任何对 Core MIDI 的调用都可能导致不显示的警报(因为主队列将被阻塞)。


更新:2019-07-17

重要的是要提到上面的解决方案,如果你最终遇到上面的 .timedOut 情况,应用程序将在将来的某个时刻崩溃无论如何,因为它 catch 了 MIDINetworkSession.default().isEnabled 调用。

崩溃前的间隙大约为 5 分钟,因此有足够的时间显示警报并建议用户重启设备。


更新:2019-08-14

推荐方案

Apple 在 iOS 12.4 中似乎已经解决了这个问题。解决方案是建议您的用户更新到 iOS 12.4 或更高版本。

(此外,这个问题似乎只影响 iOS 12.2 和 12.3 版本。)

关于ios - 任何 Core MIDI 调用都会导致应用程序无响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56039369/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com