Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息
Posted
技术标签:
【中文标题】Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息【英文标题】:Audiokit 4.9.5 crashes in xcode 11.4 + swift 5.2, no useful error message 【发布时间】:2020-04-25 14:16:02 【问题描述】:导入 AudioKit 并尝试运行一个小示例时,我得到:
Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo=NSLocalizedDescription=Rendering service was interrupted
经过多次测试,我注意到它仅在“预览(右侧边栏)”模式下崩溃,因为它“构建”并在“模拟器”中运行。这是 Xcode 中 preview
功能的限制吗?我不知道,但已向 AudioKit 团队报告 (https://github.com/AudioKit/AudioKit/issues/2034)
考虑到在 (https://audiokit.io/examples/HelloWorld/) 中发布的 hello world
,我重新编写了一些不同的内容,以适应最新的(考虑写作时间)Xcode 11.4 和 Swift 5.2:
import SwiftUI
import AudioKit
struct ContentView: View
var oscillator = AKOscillator()
var body: some View
VStack
Button("Play")
self.playSound()
.onAppear
do
AudioKit.output = self.oscillator
try AudioKit.start()
catch
print("audiokit init error")
private func playSound()
self.oscillator.amplitude = 1
self.oscillator.frequency = 440
self.oscillator.start()
struct ContentView_Previews: PreviewProvider
static var previews: some View
ContentView()
Podfile 是:
platform :ios, '11.0'
target 'AKHello' do
use_frameworks!
# Pods for AKHello
pod 'AudioKit', '~> 4.9.5'
end
源代码中是否存在一些语法错误,或者有一种方法可以得到更有意义或更有用的错误来解决这个问题? AudioKit 似乎与最新的 Xcode 11.4 兼容,考虑到 github 页面中的发行说明(https://github.com/AudioKit/AudioKit/releases,您可以在其中阅读“此版本主要是通过 CocoaPods 带来与最新 Xcode 版本兼容的新二进制文件”)
因为在 View
中初始化 AudioKit 可能不是一个好习惯(尽管目标只是运行一个简单的 Hello 世界,只是为了确保我将那部分移到 struct
中,但同样的问题发生)
// AudioPlayer.swift
import AudioKit
struct AudioPlayer
var oscillator = AKOscillator()
init()
do
AudioKit.output = self.oscillator
try AudioKit.start()
catch
print("audiokit init error")
func playSound()
self.oscillator.amplitude = 1
self.oscillator.frequency = 440
self.oscillator.start()
// ContentView.swift
import SwiftUI
struct ContentView: View
var audioPlayer: AudioPlayer = AudioPlayer()
var body: some View
VStack
Button("Play")
self.audioPlayer.playSound()
struct ContentView_Previews: PreviewProvider
static var previews: some View
ContentView()
还尝试作为可观察对象,在内容视图和场景委托中进行了相应的更改,我在其中传递了音频播放器的新类:
// ContentView.swift
import SwiftUI
struct ContentView: View
@ObservedObject var audioPlayer: AudioPlayer
var body: some View
VStack
Button("Play")
self.audioPlayer.playSound()
struct ContentView_Previews: PreviewProvider
static var previews: some View
ContentView(audioPlayer: AudioPlayer())
// AudioPlayer.swift
import AudioKit
import Combine
class AudioPlayer: ObservableObject
let objectWillChange = PassthroughSubject<AudioPlayer, Never>()
var isPlaying = false
didSet
objectWillChange.send(self)
var oscillator = AKOscillator()
init()
do
AudioKit.output = self.oscillator
try AudioKit.start()
isPlaying = true
catch
print("audiokit init error")
func playSound()
self.oscillator.amplitude = 1
self.oscillator.frequency = 440
self.oscillator.start()
// SceneDelegate.swift
import UIKit
import SwiftUI
class SceneDelegate: UIResponder, UIWindowSceneDelegate
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
let contentView = ContentView(audioPlayer: AudioPlayer())
if let windowScene = scene as? UIWindowScene
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: contentView)
self.window = window
window.makeKeyAndVisible()
【问题讨论】:
我能够使用 pod 'AudioKit'、'~> 4.0'、swift 5 和 Xcode 11.3.1 成功运行 @joyson 感谢您的宝贵时间,谢谢!我会看看我是否可以降级,但到目前为止,我会认为 AudioKit 与最新版本不兼容。但不确定这是否正确,因为releases
的详细信息提到了 XCode 11.4。
【参考方案1】:
我不确定这是否是您的全部问题,但不要指望 AudioKit 可以在预览视图中工作。据我所知,这应该只是视觉 SwiftUI 类型的东西。您将 AudioKit 的生命周期与 SwiftUI 绑定的第一种方法非常危险。请记住,SwiftUI 会做它需要做的任何神奇的事情,你不应该相信音频系统可以在其中工作。然后,您将音频播放器的内容移到了自己的类中,但我仍然担心您将生命周期与 SwiftUI 结构过于紧密地联系在一起。我的方法是将音频引擎移动到在 SceneDelegate 中创建的自己的类中,然后在主内容视图的 onAppear 上启动。有关如何设置的示例,请参阅 iOS+Catalyst/Drums/ 的 AudioKit 示例文件夹。
【讨论】:
感谢您抽出宝贵时间,非常感谢!是的,最后一个例子使用了一个应该没问题的可观察对象?该问题仅发生在预览版中,我现在认为除非另有说明,否则预览版可能会有一些限制。 不,我认为即使是您的第二个实现也有问题。真正查看示例以及它如何在 SceneDelegate 中初始化 Conductor。 谢谢!我一定会的!感谢您的帮助:)以上是关于Audiokit 4.9.5 在 xcode 11.4 + swift 5.2 中崩溃,没有有用的错误消息的主要内容,如果未能解决你的问题,请参考以下文章
Audiokit 4.7 Playgrounds 未编译。错误:无法查找符号:
AudioKit V4.1 和版本 9.3 beta (9Q98q)