困っていること
表題の通り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を使わなくても実装かのうなのであればそちらで実装したいと考えています
回答1件
あなたの回答
tips
プレビュー