wake-ios/wake/View/Owner/PermissionManagementView.swift
2025-09-01 18:35:57 +08:00

175 lines
6.1 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import SwiftUI
import UserNotifications
import Photos
///
struct PermissionManagementView: View {
// MARK: -
@State private var photoLibraryStatus: PHAuthorizationStatus = .notDetermined //
@State private var notificationStatus: UNAuthorizationStatus = .notDetermined //
var body: some View {
ZStack {
//
Color.themeTextWhiteSecondary
.edgesIgnoringSafeArea(.all)
VStack(spacing: 0) {
//
SimpleNaviHeader(title: "Permission Management") {
Router.shared.pop() //
}
.padding(.top, UIApplication.shared.windows.first?.safeAreaInsets.top ?? 0)
//
VStack(spacing: 0) {
// 1.
PermissionRow(
title: "Gallery Permissions",
isEnabled: photoLibraryStatus == .authorized
) {
requestPhotoLibraryPermission() //
}
// 2.
PermissionRow(
title: "Notification Permissions",
isEnabled: notificationStatus == .authorized
) {
requestNotificationPermission() //
}
}
.background(Color.white)
.cornerRadius(16)
.padding()
Spacer() //
}
}
.navigationBarHidden(true) //
.edgesIgnoringSafeArea(.all)
.onAppear {
//
checkPhotoLibraryPermission()
checkNotificationPermission()
}
}
// MARK: -
///
private func checkPhotoLibraryPermission() {
photoLibraryStatus = PHPhotoLibrary.authorizationStatus()
}
///
private func requestPhotoLibraryPermission() {
//
if photoLibraryStatus == .notDetermined {
PHPhotoLibrary.requestAuthorization { status in
DispatchQueue.main.async {
self.photoLibraryStatus = status
//
if status != .authorized {
self.openAppSettings()
}
}
}
} else {
//
openAppSettings()
}
}
// MARK: -
///
private func checkNotificationPermission() {
UNUserNotificationCenter.current().getNotificationSettings { settings in
DispatchQueue.main.async {
self.notificationStatus = settings.authorizationStatus
}
}
}
///
private func requestNotificationPermission() {
UNUserNotificationCenter.current().getNotificationSettings { settings in
//
if settings.authorizationStatus == .notDetermined {
//
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound]) { granted, _ in
DispatchQueue.main.async {
self.notificationStatus = granted ? .authorized : .denied
//
if !granted {
self.openAppSettings()
}
}
}
} else {
//
DispatchQueue.main.async {
self.openAppSettings()
}
}
}
}
// MARK: -
///
private func openAppSettings() {
if let url = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(url)
}
}
}
///
struct PermissionRow: View {
let title: String //
let isEnabled: Bool //
let action: () -> Void //
var body: some View {
Button(action: action) {
HStack {
//
Text(title)
.foregroundColor(.primary)
.font(.system(size: 16))
Spacer()
//
Toggle("", isOn: .constant(isEnabled))
.labelsHidden()
.tint(Color.themePrimary)
.disabled(true)
.onAppear {
// 使
let themeColor = UIColor(Color.themePrimary)
UISwitch.appearance(whenContainedInInstancesOf: [UIView.self]).onTintColor = themeColor
UISwitch.appearance(whenContainedInInstancesOf: [UIView.self]).thumbTintColor = .white
// 使
UISwitch.appearance(whenContainedInInstancesOf: [UIView.self]).backgroundColor = UIColor.clear
}
}
.padding()
}
.buttonStyle(PlainButtonStyle())
//
.overlay(
Rectangle()
.frame(height: 1)
.foregroundColor(Color(.systemGray6)),
alignment: .bottom
)
}
}
//
#Preview {
PermissionManagementView()
}