音声認識へのアクセス許可を再び表示する方法が分かりません

実現したいこと

xcode 15.1
swift 5.8.1

Speechフレームワークを使用した音声認識アプリを実装中です。

アプリ起動時に毎回「音声認識へのアクセス許可」を確認し「許可しない」だった場合、許可を求めるダイアログを表示させようと考えております。

最初のアプリ起動時は許可ダイアログは表示されますが、1度でも「許可しない」にしてしまうとダイアログが表示できません。

例えば
初回起動時に、ダイアログが表示される→ここで許可しないにする→(許可ダイアログが表示されないので)二度とアプリが使えない!

どうすればその都度ダイアログを表示できるようになるでしょうか?

イメージ説明

発生している問題・分からないこと

・音声認識を求めるダイアログは、以下のメソッドで表示している、という認識ですが、
であればなぜその都度ダイアログが表示されない?のか分からない

swift

1SFSpeechRecognizer.requestAuthorization { (authStatus) in2}3

・マイク入力の許可を求めるrequestAccessのようなメソッドはない?
例えば、マイク入力の許可を求める場合、以下でその都度表示できますが音声認識に関してはない??

swift

1AVCaptureDevice.requestAccess(for: AVMediaType.audio, completionHandler: {(granted: Bool) in})

該当のソースコード

swift

1import UIKit2import Speech3import AVFoundation4 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 = false12 override func viewDidLoad() {13 super.viewDidLoad()14 // Do any additional setup after loading the view.15 16 // 音声認識の利用の承認要求17 SFSpeechRecognizer.requestAuthorization {(authStatus) in18 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 break43 }44 }45 }46 }47 }48 49}

試したこと・調べたこと

上記の詳細・結果

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)

補足

特になし

コメントを投稿

0 コメント