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

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

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

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

Swift

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

Q&A

解決済

1回答

2144閲覧

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

hodoru3sei

総合スコア284

iOS

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

Swift

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

0グッド

0クリップ

投稿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

1struct CustomView: View { 2 @ObservedObject var microphoneAutholization = MicrophoneAutholization() 3 var body: some View { 4 Rectangle() 5 .frame(width: UIScreen.main.bounds.width, 6 height: UIScreen.main.bounds.height) 7 .foregroundColor(Color.clear) 8 .gesture(LongPressGesture().onChanged { _ in 9 10 if !isMicrophoneAuthorizationApproved() { 11 return 12 } 13 isRecording = true 14 }) 15 .alert(isPresented: self.$microphoneAutholization.invalidPermission) { 16 Alert( 17 title: Text("TITLE"), 18 message: Text("Please go to Settings and turn on the permissions"), 19 primaryButton: .cancel(Text("Cancel")), 20 secondaryButton: .default(Text("Settings"), action: { 21 if let url = URL(string: UIApplication.openSettingsURLString), UIApplication.shared.canOpenURL(url) { 22 UIApplication.shared.open(url, options: [:], completionHandler: nil) 23 } 24 })) 25 } 26 } 27 28 private func isMicrophoneAuthorizationApproved() -> Bool { 29 let status = AVCaptureDevice.authorizationStatus(for: .audio) 30 31 switch status { 32 case .authorized: 33 return true 34 default: 35 return false 36 } 37 } 38} 39 40 41import Combine 42import AVFoundation 43 44class MicrophoneAutholization: ObservableObject { 45 @Published var invalidPermission: Bool = false 46 47 var authorizationStatus: AnyPublisher< AVAuthorizationStatus, Never> { 48 Future<AVAuthorizationStatus, Never> { promise in 49 let status = AVCaptureDevice.authorizationStatus(for: .audio) 50 promise(.success(status)) 51 } 52 .eraseToAnyPublisher() 53 } 54 55 func requestAccess() { 56 self.authorizationStatus 57 .receive(on: RunLoop.main) 58 .map { $0 == .denied || $0 == .notDetermined || $0 == .restricted } 59 .assign(to: .invalidPermission, on: self) 60 } 61}

解決したいこと

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

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

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

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

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

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

zundaa

2021/12/14 07:43 編集

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

回答1

0

自己解決

https://capibara1969.com/1899/
上記の記事を参考にして解決することができました

投稿2021/12/14 15:52

hodoru3sei

総合スコア284

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問