You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
150 lines
4.2 KiB
150 lines
4.2 KiB
![]()
2 years ago
|
//
|
||
|
// SystemAuthority.swift
|
||
|
// FunDoHealth
|
||
|
//
|
||
|
// Created by ecell on 2018/5/5.
|
||
|
// Copyright © 2020年 ecell. All rights reserved.
|
||
|
//
|
||
|
|
||
|
import Foundation
|
||
|
import CoreLocation
|
||
|
import Photos
|
||
|
|
||
|
fileprivate enum AuthorityType {
|
||
|
case location
|
||
|
case photos
|
||
|
case camera
|
||
|
}
|
||
|
|
||
|
final class SystemAuthority: NSObject {
|
||
|
|
||
|
/// 单例
|
||
|
static let shared = SystemAuthority()
|
||
|
private override init() {}
|
||
|
|
||
|
// 结果回调
|
||
|
typealias resultBlock = (Bool) -> ()
|
||
|
var resultAAA: resultBlock?
|
||
|
|
||
|
// MARK:- 获取定位权限
|
||
|
private let locationManager = CLLocationManager()
|
||
|
func getLocationAuthority(result: @escaping resultBlock) {
|
||
|
// 判断权限状态
|
||
|
switch CLLocationManager.authorizationStatus() {
|
||
|
case .notDetermined:
|
||
|
// 首次选择,获取定位
|
||
|
locationManager.requestAlwaysAuthorization()
|
||
|
locationManager.requestWhenInUseAuthorization()
|
||
|
// 监听点击
|
||
|
locationManager.delegate = self
|
||
|
resultAAA = result
|
||
|
case .restricted, .denied:
|
||
|
// 提示用户开启权限
|
||
|
alertSetAuthority(type: .location)
|
||
|
result(false)
|
||
|
case .authorizedAlways, .authorizedWhenInUse:
|
||
|
// 已开启权限
|
||
|
result(true)
|
||
|
default: break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MARK:- 获取相册权限
|
||
|
func getPhotoAuthority(result: @escaping resultBlock) {
|
||
|
let status = PHPhotoLibrary.authorizationStatus()
|
||
|
// 已获取成功
|
||
|
if status == .authorized {
|
||
|
result(true)
|
||
|
return
|
||
|
}
|
||
|
// 未获取权限
|
||
|
if status == .notDetermined {
|
||
|
PHPhotoLibrary.requestAuthorization { [weak self] newstatus in
|
||
|
if newstatus == .authorized {
|
||
|
result(true)
|
||
|
return
|
||
|
}
|
||
|
// 提示用户开启权限
|
||
|
self?.alertSetAuthority(type: .photos)
|
||
|
result(false)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
// 提示用户开启权限
|
||
|
alertSetAuthority(type: .photos)
|
||
|
result(false)
|
||
|
}
|
||
|
|
||
|
// MARK:- 获取相机权限
|
||
|
func getCameraAuthority(result: @escaping resultBlock) {
|
||
|
let status = AVCaptureDevice.authorizationStatus(for: .video)
|
||
|
if status == .authorized {
|
||
|
result(true)
|
||
|
return
|
||
|
}
|
||
|
if status == .notDetermined {
|
||
|
AVCaptureDevice.requestAccess(for: .video) { [weak self] granted in
|
||
|
result(granted)
|
||
|
if !granted {
|
||
|
// 提示用户开启权限
|
||
|
self?.alertSetAuthority(type: .camera)
|
||
|
}
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
// 提示用户开启权限
|
||
|
alertSetAuthority(type: .camera)
|
||
|
result(false)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
// MARK:- 定位权限协议
|
||
|
extension SystemAuthority: CLLocationManagerDelegate {
|
||
|
|
||
|
func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) {
|
||
|
switch status {
|
||
|
case .restricted, .denied:
|
||
|
// 提示用户开启权限
|
||
|
resultAAA!(false)
|
||
|
break
|
||
|
case .authorizedAlways, .authorizedWhenInUse:
|
||
|
resultAAA!(true)
|
||
|
break
|
||
|
case .notDetermined: break
|
||
|
default: break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// MARK:- 提示处理
|
||
|
extension SystemAuthority {
|
||
|
|
||
|
fileprivate func alertSetAuthority(type: AuthorityType) {
|
||
|
var title: String = ""
|
||
|
switch type {
|
||
|
case .location: break
|
||
|
case .photos:
|
||
|
title = MultiLanguageKey.photoTip.localized
|
||
|
case .camera:
|
||
|
title = MultiLanguageKey.cameraiTip.localized
|
||
|
}
|
||
|
if let vc = keyWindow.rootViewController {
|
||
|
showAlert(vc, title, cancelText: MultiLanguageKey.cancel.localized, confirmText: MultiLanguageKey.open.localized) { (result) in
|
||
|
if result {
|
||
|
if let url = URL(string: UIApplication.openSettingsURLString) {
|
||
|
if UIApplication.shared.canOpenURL(url) {
|
||
|
UIApplication.shared.openURL(url)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|