###現象
SwiftでAudioKitを用いたアプリを作成し、リリースしたところ、crashデータが複数報告されました。全て同じcrashで、ログは以下の通りでした。
自分の環境では何度もテストしているうちでは少なくとも一度も再現されておらず、原因が全くわかりません。
このcrashが発生しているデバイスはiPhone 8, X, XS, iPadなど様々で、iOSも13.3.1 ~ 13.3.4と、特定の機種・OSなどはなさそうです。
原因や対策として考えられるものがあれば、ご教授いただければ幸いです。
1 libobjc.A.dylib objc_exception_throw 2 CoreFoundation +[NSException raise:format:arguments:] 3 AVFAudio AVAE_RaiseException(NSString*,...) 4 AVFAudio _AVAE_Check(char const*, int, char const*, char const*, bool) 5 AVFAudio AVAudioEngineGraph::_Connect(AVAudioNodeImplBase*, AVAudioNodeImplBase*, unsigned int, unsigned i... 6 AVFAudio AVAudioEngineImpl::Connect(AVAudioNode*, AVAudioNode*, unsigned long, unsigned long, AVAudioFormat*) 7 AVFAudio -[AVAudioEngine connect::to:format:] 8 [アプリ名] specialized AKMicrophone.init(with:) 9 [アプリ名] AKMicrophone.init(with:) 10 [アプリ名] XXX.startAK() (←自分で作ったメソッド、後述) . . .
###ソースコード
Swift
1import SwiftUI 2import Combine 3import AudioKit 4import AVFoundation 5 6final class XXX: observableObject { 7 var isAKStart: Bool = false 8 var mic: AKMicrophone! 9 var tracker: AKFrequencyTracker! 10 var silence: AKBooster! 11 12 func startAK() { 13 mic = AKMicrophone() 14 tracker = AKFrequencyTracker(mic) 15 silence = AKBooster(tracker, gain: 0) 16 AudioKit.output = silence 17 18 do { 19 try AudioKit.start() 20 self.isAKStart = true 21 } catch { 22 AKLog("AudioKit did not start!") 23 } 24 } 25 26 func start(userData: UserData) { 27 let status = AVCaptureDevice.authorizationStatus(for: AVMediaType.audio) 28 29 if status == AVAuthorizationStatus.authorized { 30 if !self.isAKStart { 31 self.startAK() 32 } 33 } else { 34 AVCaptureDevice.requestAccess(for: AVMediaType.audio, completionHandler: { (isSuccess) in 35 DispatchQueue.main.async { 36 if (isSuccess) { 37 if !self.isAKStart { 38 self.startAK() 39 } else { 40 //許可がない場合の処理 41 } 42 } 43 } 44 }) 45 } 46 47 } 48} 49 50//~~~~~~~~~~~~~~~~~~~~~~~ 51//~~~~~~~~~~~~~~~~~~~~~~~ 52import SwiftUI 53 54struct ContentView: View { 55 @EnvironmentObject var xxx: XXX 56 57 var body: some View { 58 VStack { 59 //いろいろ 60 } 61 .onAppear { 62 self.xxx.start() 63 } 64 } 65}
###試したこと
マイクへのアクセス許可がない状態でAKMicrophoneを使おうとしたのが原因かと思い、マイクへのアクセス許可がない場合はAKMicrophoneを使わないように仕様を変更した(上記ソースコードには反映済み)のですが、その新しいversionでもcrashデータが報告されていました。
###追記
提案いただいたこちら(https://github.com/AudioKit/AudioKit/issues/969)を確認し、アプリ使用中に電話を着信して応答したところ、以下のようなログが出ました。
crashは再現できませんでしたが、エラーは出ており、それも気になるところではあります。
[aurioc] AURemoteIO.cpp:1590:Start: AUIOClient_StartIO failed (561017449) [avae] AVAEInternal.h:109 [AVAudioEngineGraph.mm:1544:Start: (err = PerformCommand(*ioNode, kAUStartIO, NULL, 0)): error 561017449 [general] AudioKit+StartStop.swift:restartEngineAfterRouteChange(_:):198:error restarting engine after route change (AudioKit+StartStop.swift:restartEngineAfterRouteChange(_:):198) [general] AudioKit+StartStop.swift:restartEngineAfterConfigurationChange(_:):144:engine not restarted after configuration change since app was not active and does not support background audio (AudioKit+StartStop.swift:restartEngineAfterConfigurationChange(_:):144) [general] AudioKit+StartStop.swift:restartEngineAfterRouteChange(_:):183:engine not restarted after route change since app was not active and does not support background audio (AudioKit+StartStop.swift:restartEngineAfterRouteChange(_:):183) [general] AudioKit+StartStop.swift:restartEngineAfterConfigurationChange(_:):144:engine not restarted after configuration change since app was not active and does not support background audio (AudioKit+StartStop.swift:restartEngineAfterConfigurationChange(_:):144)
あなたの回答
tips
プレビュー