質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
87.20%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

解決済

SwiftUIでpermissionが許可されていない場合にダイアログを表示させたい

hodoru3sei
hodoru3sei

総合スコア281

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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

1回答

0評価

0クリップ

481閲覧

投稿2021/12/14 07:32

困っていること

表題の通りSwiftUIでpermissionの判定をして、もし許可されていない場合ダイアログを表示させて設定画面に飛ばすような挙動を実装したいとかんがえているのですがどう実装して良いのかわからず困っています。

試したこと

調べているとCombineで実装している以下のような記事があったので参考にしてみたのですが、アラートがうまく表示されませんでした
https://stackoverflow.com/questions/62561308/swiftui-direct-a-user-to-their-settings-page-if-authorizationstatus-is-denied

試したコード

Swift

struct CustomView: View { @ObservedObject var microphoneAutholization = MicrophoneAutholization() var body: some View { Rectangle() .frame(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) .foregroundColor(Color.clear) .gesture(LongPressGesture().onChanged { _ in if !isMicrophoneAuthorizationApproved() { return } isRecording = true }) .alert(isPresented: self.$microphoneAutholization.invalidPermission) { Alert( title: Text("TITLE"), message: Text("Please go to Settings and turn on the permissions"), primaryButton: .cancel(Text("Cancel")), secondaryButton: .default(Text("Settings"), action: { if let url = URL(string: UIApplication.openSettingsURLString), UIApplication.shared.canOpenURL(url) { UIApplication.shared.open(url, options: [:], completionHandler: nil) } })) } } private func isMicrophoneAuthorizationApproved() -> Bool { let status = AVCaptureDevice.authorizationStatus(for: .audio) switch status { case .authorized: return true default: return false } } } import Combine import AVFoundation class MicrophoneAutholization: ObservableObject { @Published var invalidPermission: Bool = false var authorizationStatus: AnyPublisher< AVAuthorizationStatus, Never> { Future<AVAuthorizationStatus, Never> { promise in let status = AVCaptureDevice.authorizationStatus(for: .audio) promise(.success(status)) } .eraseToAnyPublisher() } func requestAccess() { self.authorizationStatus .receive(on: RunLoop.main) .map { $0 == .denied || $0 == .notDetermined || $0 == .restricted } .assign(to: .invalidPermission, on: self) } }

解決したいこと

今回無理にCombineを理解しようとは思っておらずCombineを使わなくても実装かのうなのであればそちらで実装したいと考えています

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

zundaa
zundaa

2021/12/14 07:43 編集

SwiftUIのalertではその引数invalidPermissionのon/offが切り替わったタイミングでalertが発動します。 invalidPermissionが切り替わる処理は入っているでしょうか?

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

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