feat: 权限

This commit is contained in:
jinyaqiu 2025-08-31 17:54:20 +08:00
parent b89b3b0cc4
commit 4cbfaefb49
3 changed files with 173 additions and 1 deletions

View File

@ -14,6 +14,7 @@ enum AppRoute: Hashable {
case userInfo case userInfo
case account case account
case about case about
case permissionManagement
@ViewBuilder @ViewBuilder
var view: some View { var view: some View {
@ -42,6 +43,8 @@ enum AppRoute: Hashable {
AccountView() AccountView()
case .about: case .about:
AboutUsView() AboutUsView()
case .permissionManagement:
PermissionManagementView()
} }
} }
} }

View File

@ -0,0 +1,167 @@
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) //
}
.padding()
}
.buttonStyle(PlainButtonStyle())
//
.overlay(
Rectangle()
.frame(height: 1)
.foregroundColor(Color(.systemGray6)),
alignment: .bottom
)
}
}
//
#Preview {
PermissionManagementView()
}

View File

@ -51,7 +51,9 @@ struct SettingsView: View {
settingRow( settingRow(
icon: "Permission", icon: "Permission",
title: "Permission Management", title: "Permission Management",
action: {} action: {
Router.shared.navigate(to: .permissionManagement)
}
) )
// //