AcaMate_iOS/AcaMate/5. Manager/PermissionManager.swift

87 lines
2.7 KiB
Swift

//
// PermissionManager.swift
// AcaMate
//
// Created by TAnine on 3/28/25.
//
import Foundation
import AVFoundation
import Photos
import CoreLocation
import UserNotifications
class PermissionManager: NSObject, ObservableObject {
private let locationManager = CLLocationManager()
private var locationRequestCallback: ((CLAuthorizationStatus) -> Void)?
override init() {
super.init()
locationManager.delegate = self
}
// MARK: -
func requestPushPermission(completion: @escaping (Bool) -> Void) {
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
DispatchQueue.main.async {
completion(granted)
}
}
}
// MARK: -
func requestCameraPermission(completion: @escaping (Bool) -> Void) {
AVCaptureDevice.requestAccess(for: .video) { granted in
DispatchQueue.main.async {
completion(granted)
}
}
}
// MARK: -
func requestPhotoPermission(completion: @escaping (PHAuthorizationStatus) -> Void) {
PHPhotoLibrary.requestAuthorization { status in
DispatchQueue.main.async {
completion(status)
}
}
}
// MARK: -
func requestLocationPermission(completion: @escaping (CLAuthorizationStatus) -> Void) {
locationRequestCallback = completion
locationManager.requestWhenInUseAuthorization()
}
// MARK: -
func checkPushPermission(completion: @escaping (Bool) -> Void) {
UNUserNotificationCenter.current().getNotificationSettings { settings in
DispatchQueue.main.async {
completion(settings.authorizationStatus == .authorized)
}
}
}
func checkCameraPermission() -> Bool {
return AVCaptureDevice.authorizationStatus(for: .video) == .authorized
}
func checkPhotoPermission() -> Bool {
let status = PHPhotoLibrary.authorizationStatus(for: .readWrite)
return status == .authorized || status == .limited
}
func checkLocationPermission() -> Bool {
let status = locationManager.authorizationStatus
return status == .authorizedAlways || status == .authorizedWhenInUse
}
}
extension PermissionManager: CLLocationManagerDelegate {
func locationManagerDidChangeAuthorization(_ manager: CLLocationManager) {
let status = manager.authorizationStatus
locationRequestCallback?(status)
locationRequestCallback = nil
}
}