1.選擇導(dǎo)入頭文件
import Photos
import AssetsLibrary
import MediaPlayer
import CoreTelephony
import CoreLocation
import AVFoundation
1.是否開啟媒體資料庫(kù)/Apple Music 服務(wù)
/// 是否開啟媒體資料庫(kù)/Apple Music 服務(wù) 需要iOS9.3之后可使用
@available(iOS 9.3, *)
func openMediaPlayerServiceWithBlock(action :@escaping ((Bool)->())) {
let authStatus = MPMediaLibrary.authorizationStatus()
if authStatus == MPMediaLibraryAuthorizationStatus.notDetermined {
MPMediaLibrary.requestAuthorization { (status) in
if (status == MPMediaLibraryAuthorizationStatus.authorized) {
DispatchQueue.main.async {
action(true)
}
}else{
DispatchQueue.main.async {
action(false)
}
}
}
} else if authStatus == MPMediaLibraryAuthorizationStatus.authorized {
action(true)
} else {
action(false)
}
}
2.檢測(cè)是否開啟聯(lián)網(wǎng)
/// 檢測(cè)是否開啟聯(lián)網(wǎng)
func hw_openEventServiceWithBolck(action :@escaping ((Bool)->())) {
let cellularData = CTCellularData()
cellularData.cellularDataRestrictionDidUpdateNotifier = { (state) in
if state == CTCellularDataRestrictedState.restrictedStateUnknown || state == CTCellularDataRestrictedState.notRestricted {
action(false)
} else {
action(true)
}
}
let state = cellularData.restrictedState
if state == CTCellularDataRestrictedState.restrictedStateUnknown || state == CTCellularDataRestrictedState.notRestricted {
action(false)
} else {
action(true)
}
}
3.檢測(cè)是否開啟定位
/// 檢測(cè)是否開啟定位
func hw_openLocationServiceWithBlock(action :@escaping ((Bool)->())) {
var isOpen = false
if CLLocationManager.locationServicesEnabled() || CLLocationManager.authorizationStatus() != .denied {
isOpen = true
}
action(isOpen)
}
4.檢測(cè)是否開啟攝像頭
/// 檢測(cè)是否開啟攝像頭
func hw_openCaptureDeviceServiceWithBlock(action :@escaping ((Bool)->())) {
let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
if authStatus == AVAuthorizationStatus.notDetermined {
AVCaptureDevice.requestAccess(for: AVMediaType.video) { (granted) in
action(granted)
}
} else if authStatus == AVAuthorizationStatus.restricted || authStatus == AVAuthorizationStatus.denied {
action(false)
} else {
action(true)
}
}
5.檢測(cè)是否開啟相冊(cè)
/// 檢測(cè)是否開啟相冊(cè)
func hw_openAlbumServiceWithBlock(action :@escaping ((Bool)->())) {
var isOpen = true
let authStatus = PHPhotoLibrary.authorizationStatus()
if authStatus == PHAuthorizationStatus.restricted || authStatus == PHAuthorizationStatus.denied {
isOpen = false;
}
action(isOpen)
}
6.檢測(cè)是否開啟麥克風(fēng)
/// 檢測(cè)是否開啟麥克風(fēng)
func hw_openRecordServiceWithBlock(action :@escaping ((Bool)->())) {
let permissionStatus = AVAudioSession.sharedInstance().recordPermission()
if permissionStatus == AVAudioSessionRecordPermission.undetermined {
AVAudioSession.sharedInstance().requestRecordPermission { (granted) in
action(granted)
}
} else if permissionStatus == AVAudioSessionRecordPermission.denied {
action(false)
} else {
action(true)
}
}
7.跳轉(zhuǎn)系統(tǒng)設(shè)置界面
// MARK: - 跳轉(zhuǎn)系統(tǒng)設(shè)置界面
func hw_OpenURL() {
let url = URL(string: UIApplicationOpenSettingsURLString)
let alertController = UIAlertController(title: "訪問(wèn)受限",
message: "點(diǎn)擊“設(shè)置”,允許訪問(wèn)權(quán)限",
preferredStyle: .alert)
let cancelAction = UIAlertAction(title:"取消", style: .cancel, handler:nil)
let settingsAction = UIAlertAction(title:"設(shè)置", style: .default, handler: {
(action) -> Void in
if UIApplication.shared.canOpenURL(url!) {
if #available(iOS 10, *) {
UIApplication.shared.open(url!, options: [:],completionHandler: {(success) in})
} else {
UIApplication.shared.openURL(url!)
}
}
})
alertController.addAction(cancelAction)
alertController.addAction(settingsAction)
UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil)
}
代碼更新(新增isSet == true
快速跳轉(zhuǎn)提示)
注意可以直接復(fù)制 不影響以前使用
修復(fù)定位權(quán)限檢測(cè)不準(zhǔn)
import Photos
import AssetsLibrary
import MediaPlayer
import CoreTelephony
import CoreLocation
import AVFoundation
enum HWpermissionsType{
/// 相機(jī)
case camera
/// 相冊(cè)
case photo
/// 位置
case location
/// 網(wǎng)絡(luò)
case network
/// 麥克風(fēng)
case microphone
/// 媒體庫(kù)
case media
}
// MARK: - 開啟媒體資料庫(kù)/Apple Music 服務(wù)
/// 開啟媒體資料庫(kù)/Apple Music 服務(wù)
@available(iOS 9.3, *)
func hw_openMediaPlayerServiceWithBlock(_ isSet:Bool? = nil,_ action :@escaping ((Bool)->())) {
let authStatus = MPMediaLibrary.authorizationStatus()
if authStatus == MPMediaLibraryAuthorizationStatus.notDetermined {
MPMediaLibrary.requestAuthorization { (status) in
if (status == MPMediaLibraryAuthorizationStatus.authorized) {
DispatchQueue.main.async {
action(true)
}
}else{
DispatchQueue.main.async {
action(false)
if isSet == true {hw_OpenURL(.media)}
}
}
}
} else if authStatus == MPMediaLibraryAuthorizationStatus.authorized {
action(true)
} else {
action(false)
if isSet == true {hw_OpenURL(.media)}
}
}
// MARK: - 檢測(cè)是否開啟聯(lián)網(wǎng)
/// 檢測(cè)是否開啟聯(lián)網(wǎng)
func hw_openEventServiceWithBolck(_ isSet:Bool? = nil,_ action :@escaping ((Bool)->())) {
let cellularData = CTCellularData()
cellularData.cellularDataRestrictionDidUpdateNotifier = { (state) in
if state == CTCellularDataRestrictedState.restrictedStateUnknown || state == CTCellularDataRestrictedState.notRestricted {
action(false)
if isSet == true {hw_OpenURL(.network)}
} else {
action(true)
}
}
let state = cellularData.restrictedState
if state == CTCellularDataRestrictedState.restrictedStateUnknown || state == CTCellularDataRestrictedState.notRestricted {
action(false)
if isSet == true {hw_OpenURL(.network)}
} else {
action(true)
}
}
// MARK: - 檢測(cè)是否開啟定位
/// 檢測(cè)是否開啟定位
func hw_openLocationServiceWithBlock(_ isSet:Bool? = nil,_ action :@escaping ((Bool)->())) {
var isOpen = false
// if CLLocationManager.locationServicesEnabled() || CLLocationManager.authorizationStatus() != .denied {
// isOpen = true
// }
if CLLocationManager.authorizationStatus() != .restricted && CLLocationManager.authorizationStatus() != .denied {
isOpen = true
}
if isOpen == false && isSet == true {hw_OpenURL(.location)}
action(isOpen)
}
// MARK: - 檢測(cè)是否開啟攝像頭
/// 檢測(cè)是否開啟攝像頭 (可用)
func hw_openCaptureDeviceServiceWithBlock(_ isSet:Bool? = nil,_ action :@escaping ((Bool)->())) {
let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
if authStatus == AVAuthorizationStatus.notDetermined {
AVCaptureDevice.requestAccess(for: AVMediaType.video) { (granted) in
action(granted)
if granted == false && isSet == true {hw_OpenURL(.camera)}
}
} else if authStatus == AVAuthorizationStatus.restricted || authStatus == AVAuthorizationStatus.denied {
action(false)
if isSet == true {hw_OpenURL(.camera)}
} else {
action(true)
}
}
// MARK: - 檢測(cè)是否開啟相冊(cè)
/// 檢測(cè)是否開啟相冊(cè)
func hw_openAlbumServiceWithBlock(_ isSet:Bool? = nil,_ action :@escaping ((Bool)->())) {
var isOpen = true
let authStatus = PHPhotoLibrary.authorizationStatus()
if authStatus == PHAuthorizationStatus.restricted || authStatus == PHAuthorizationStatus.denied {
isOpen = false;
if isSet == true {hw_OpenURL(.photo)}
}
action(isOpen)
}
// MARK: - 檢測(cè)是否開啟麥克風(fēng)
/// 檢測(cè)是否開啟麥克風(fēng)
func hw_openRecordServiceWithBlock(_ isSet:Bool? = nil,_ action :@escaping ((Bool)->())) {
let permissionStatus = AVAudioSession.sharedInstance().recordPermission()
if permissionStatus == AVAudioSessionRecordPermission.undetermined {
AVAudioSession.sharedInstance().requestRecordPermission { (granted) in
action(granted)
if granted == false && isSet == true {hw_OpenURL(.microphone)}
}
} else if permissionStatus == AVAudioSessionRecordPermission.denied || permissionStatus == AVAudioSessionRecordPermission.undetermined{
action(false)
if isSet == true {hw_OpenURL(.microphone)}
} else {
action(true)
}
}
// MARK: - 跳轉(zhuǎn)系統(tǒng)設(shè)置界面
func hw_OpenURL(_ type: HWpermissionsType? = nil) {
let title = "訪問(wèn)受限"
var message = "請(qǐng)點(diǎn)擊“前往”权埠,允許訪問(wèn)權(quán)限"
let appName: String = (Bundle.main.infoDictionary!["CFBundleDisplayName"] ?? "") as! String //App 名稱
if type == .camera { // 相機(jī)
message = "請(qǐng)?jiān)趇Phone的\"設(shè)置-隱私-相機(jī)\"選項(xiàng)中榨了,允許\"\(appName)\"訪問(wèn)你的相機(jī)"
} else if type == .photo { // 相冊(cè)
message = "請(qǐng)?jiān)趇Phone的\"設(shè)置-隱私-照片\"選項(xiàng)中,允許\"\(appName)\"訪問(wèn)您的相冊(cè)"
} else if type == .location { // 位置
message = "請(qǐng)?jiān)趇Phone的\"設(shè)置-隱私-定位服務(wù)\"選項(xiàng)中攘蔽,允許\"\(appName)\"訪問(wèn)您的位置龙屉,獲得更多商品信息"
} else if type == .network { // 網(wǎng)絡(luò)
message = "請(qǐng)?jiān)趇Phone的\"設(shè)置-蜂窩移動(dòng)網(wǎng)絡(luò)\"選項(xiàng)中,允許\"\(appName)\"訪問(wèn)您的移動(dòng)網(wǎng)絡(luò)"
} else if type == .microphone { // 麥克風(fēng)
message = "請(qǐng)?jiān)趇Phone的\"設(shè)置-隱私-麥克風(fēng)\"選項(xiàng)中满俗,允許\"\(appName)\"訪問(wèn)您的麥克風(fēng)"
} else if type == .media { // 媒體庫(kù)
message = "請(qǐng)?jiān)趇Phone的\"設(shè)置-隱私-媒體與Apple Music\"選項(xiàng)中转捕,允許\"\(appName)\"訪問(wèn)您的媒體庫(kù)"
}
let url = URL(string: UIApplicationOpenSettingsURLString)
let alertController = UIAlertController(title: title,
message: message,
preferredStyle: .alert)
let cancelAction = UIAlertAction(title:"取消", style: .cancel, handler:nil)
let settingsAction = UIAlertAction(title:"前往", style: .default, handler: {
(action) -> Void in
if UIApplication.shared.canOpenURL(url!) {
if #available(iOS 10, *) {
UIApplication.shared.open(url!, options: [:],completionHandler: {(success) in})
} else {
UIApplication.shared.openURL(url!)
}
}
})
alertController.addAction(cancelAction)
alertController.addAction(settingsAction)
UIApplication.shared.keyWindow?.rootViewController?.present(alertController, animated: true, completion: nil)
}