質問するログイン新規登録
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

276閲覧

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

pecchan

総合スコア592

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2024/03/15 05:34

編集2024/03/15 08:20

0

0

実現したいこと

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)

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

iOSの仕組み的に無理そうかなと思いました。

最初のユーザーの選択は保存されるため、2回目以降ダイアログは表示されないみたいです。

SFSpeechRecognizer / requestAuthorization(_:)
Discussion
The user's response is saved so that future calls to this method do not prompt the user again.
ユーザーの応答は保存されるため、今後このメソッドを呼び出しても再度プロンプトが表示されることはありません。

requestAuthorization(_:) | Apple Developer Documentation

これはAVCaptureDeviceの方も同じみたいです。

AVCaptureDevice / requestAccess(for:completionHandler:)
Discussion
The system saves the user’s selection so that it doesn’t have to prompt the user again. A user can change their authorization status in the Settings app.
システムはユーザーの選択を保存するので、再度ユーザーにプロンプトを表示する必要はありません。ユーザーは、設定アプリで承認ステータスを変更できます。

requestAccess(for:completionHandler:) | Apple Developer Documentation

そういう仕様みたいです。

投稿2024/03/15 14:06

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

pecchan

2024/03/15 22:44

もっとドキュメントを確認すべきでしたね。すみません。 有難う御座いました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問