Похоже, что приложение работает нормально как в macOS, так и в iOS, пока я не отправлю его в фоновый режим в iOS, а затем снова открою его позже. Это происходит не всегда, поэтому сложно проверить, но это происходит примерно в половине случаев, особенно после того, как я оставил приложение в фоновом режиме на долгое время (несколько часов).
Я предполагаю, что это «зависание» происходит из-за того, что AudioEngine() AudioKit не запускается должным образом после открытия из фона, поскольку все, что делает мое приложение, — это показывает текущую ноту, частоту и т. д. Итак, если приложение не получает никакого звука информации, не будет Обновления пользовательского интерфейса.
Полный код воспроизведения
Это простейший возможный полный код, необходимый для воспроизведения проблемы (в результате появляется экран, показывающий, какая нота воспроизводится).
Чтобы увидеть полный исходный код, вот мой репозиторий Github (самый последний/текущий коммит).
Вот как выглядит полный пользовательский интерфейс например: на этом снимке экрана я открыл приложение в фоновом режиме, и оно остается зависшим именно в этом положении, пока я полностью не закрою приложение и не перезапущу его.
Скриншот пользовательского интерфейса
Код: Выделить всё
import AudioKit
import SoundpipeAudioKit // PitchTap
import AudioKitEX // Fader
import AVFoundation // AVAudioSession
import SwiftUI
struct ContentView: View {
@StateObject var td = ToneDetector()
var body: some View {
VStack {
Text(td.data.note)
.font(.system(size: 100, design: .serif))
}
.task {
await PermissionsChecker.getMicrophoneAccess()
}
.task {
if !td.engine.avEngine.isRunning {
td.start()
}
}
}
}
struct TunerData {
var note = "-"
}
class ToneDetector : ObservableObject, HasAudioEngine {
@Published var data = TunerData()
let engine = AudioEngine()
let mic: AudioEngine.InputNode
let tappableA: Fader
let tappableB: Fader
let silence: Fader
var tracker: PitchTap!
let noteFrequencies: [Float] = [16.35, 17.32, 18.35, 19.45, 20.6, 21.83, 23.12, 24.5, 25.96, 27.5, 29.14, 30.87]
let noteNamesFlats = ["C", "C♯", "D", "D♯", "E", "F", "F♯", "G", "G♯", "A", "A♯", "B"]
let noteNamesSharps = ["C", "D♭", "D", "E♭", "E", "F", "G♭", "G", "A♭", "A", "B♭", "B"]
init() {
guard let inputTmp = engine.input else { fatalError() }
mic = inputTmp
tappableA = Fader(mic)
tappableB = Fader(tappableA)
silence = Fader(tappableB, gain: 0)
engine.output = silence
PermissionsChecker.setSessionParameters()
tracker = PitchTap(mic) { pitch, amp in
DispatchQueue.main.async {
self.update(pitch[0], amp[0])
}
}
tracker.start()
}
func update(_ pitch: AUValue, _ amp: AUValue) {
guard amp > 0.07 else { return }
// Get the frequency down or up to the range that we know
var frequency = pitch
while frequency > Float(noteFrequencies[noteFrequencies.count - 1]) {
frequency /= 2.0
}
while frequency < Float(noteFrequencies[0]) {
frequency *= 2.0
}
// Find the known note frequency we are CLOSEST to
var minDistance: Float = 10000.0
var index = 0
for possibleIndex in 0..
Подробнее здесь: [url]https://stackoverflow.com/questions/78613043/swiftui-audiokit-ios-application-freezing-when-opened-from-background[/url]
Мобильная версия