実現したいこと
xcode 15.1
swift 5.8.1
Speechフレームワークを使用した音声認識アプリを実装中です。
アプリ起動時に毎回「音声認識へのアクセス許可」を確認し「許可しない」だった場合、許可を求めるダイアログを表示させようと考えております。
最初のアプリ起動時は許可ダイアログは表示されますが、1度でも「許可しない」にしてしまうとダイアログが表示できません。
例えば
初回起動時に、ダイアログが表示される→ここで許可しないにする→(許可ダイアログが表示されないので)二度とアプリが使えない!
どうすればその都度ダイアログを表示できるようになるでしょうか?
発生している問題・分からないこと
・音声認識を求めるダイアログは、以下のメソッドで表示している、という認識ですが、
であればなぜその都度ダイアログが表示されない?のか分からない
swift
1SFSpeechRecognizer.requestAuthorization { (authStatus) in 2} 3
・マイク入力の許可を求めるrequestAccessのようなメソッドはない?
例えば、マイク入力の許可を求める場合、以下でその都度表示できますが音声認識に関してはない??
swift
1AVCaptureDevice.requestAccess(for: AVMediaType.audio, completionHandler: {(granted: Bool) in})
該当のソースコード
swift
1import UIKit 2import Speech 3import AVFoundation 4 5class ViewController: UIViewController { 6 7 let recognizer = SFSpeechRecognizer(locale: Locale.init(identifier: "ja_JP"))! 8 let audioEngine = AVAudioEngine() 9 let recognitionReq = SFSpeechAudioBufferRecognitionRequest() 10 var recognitionTask: SFSpeechRecognitionTask! 11 var recording: Bool = false 12 override func viewDidLoad() { 13 super.viewDidLoad() 14 // Do any additional setup after loading the view. 15 16 // 音声認識の利用の承認要求 17 SFSpeechRecognizer.requestAuthorization {(authStatus) in 18 DispatchQueue.main.async { 19 20 // 許可の状態に応じて UI を更新する 21 OperationQueue.main.addOperation { 22 switch authStatus { 23 case .authorized: 24 print("authorized") 25 // 「発話してください」アラートを出すなどの処理 26 case .denied: 27 print("denied") 28 // 拒否された時の処理 29 // ここで何をどう表示すれば良い? 30 31 /* ↓のようにマイク利用の許可ダイアログなんかは表示できる 32 AVCaptureDevice.requestAccess(for: AVMediaType.audio, completionHandler: {(granted: Bool) in}) 33 */ 34 35 case .restricted: 36 print("restricted") 37 // 制限を知らせるアラートを出すなどの処理 38 case .notDetermined: 39 print("notDetermined") 40 // 許可を求めるアラートを出すなどの処理 41 default: 42 break 43 } 44 } 45 } 46 } 47 } 48 49}
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
case .denied:
において
マイク入力の許可ダイアログは表示させることが出来た
swift
1AVCaptureDevice.requestAccess(for: AVMediaType.audio, completionHandler: {(granted: Bool) in})
・独自のアラートを表示して許可を促すことは出来た
swift
1 case .denied: 2 print("denied") 3 // 拒否された時の処理 4 let dialog = UIAlertController(title: "アラート", message: "「設定」からアプリの音声認識を許可してください", preferredStyle: .alert) 5 6 dialog.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) 7 8 self.present(dialog, animated: true, completion: nil)
補足
特になし

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/03/15 22:44