jsdw_ios/QuickLocation/Section/Mine/CheckPermission/CheckPermissionGuideVC.swift

231 lines
7.5 KiB
Swift

//
// CheckPermissionGuideVC.swift
// QuickLocation
//
import UIKit
import RxSwift
import RxCocoa
final class CheckPermissionGuideVC: BaseViewController {
enum Kind {
case location
case screenTime
}
private let kind: Kind
init(kind: Kind) {
self.kind = kind
super.init(nibName: nil, bundle: nil)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
bindActions()
refreshActionButton()
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
refreshActionButton()
}
private func bindActions() {
if kind == .location {
tipsLab.rx.tapGesture.subscribe { _ in
AppRouter.push(Route.web, userInfo: ["url": URLManager.shared.privacyPolicyUrl])
}.disposed(by: disposeBag)
}
settingBtn.rx.tap.subscribe(onNext: { [weak self] in
self?.handleAction()
}).disposed(by: disposeBag)
}
private func handleAction() {
switch kind {
case .location:
openSystemSettings()
case .screenTime:
requestScreenTimeAuthorization()
}
}
private func openSystemSettings() {
guard let settingsURL = URL(string: UIApplication.openSettingsURLString) else { return }
if UIApplication.shared.canOpenURL(settingsURL) {
UIApplication.shared.open(settingsURL, options: [:], completionHandler: nil)
}
}
private func requestScreenTimeAuthorization() {
guard #available(iOS 16.0, *) else {
DLToast.show(text: "该功能需要 iOS 16 及以上系统")
return
}
Task { @MainActor [weak self] in
do {
if !AppRestrictManager.shared.isAuthorized {
try await AppRestrictManager.shared.requestAuthorization()
}
guard AppRestrictManager.shared.isAuthorized else {
DLToast.show(text: "需要屏幕使用时间权限")
self?.refreshActionButton()
return
}
self?.refreshActionButton()
} catch {
DLToast.show(text: "授权失败,请在设置中开启屏幕使用时间权限")
self?.refreshActionButton()
}
}
}
private func refreshActionButton() {
switch kind {
case .location:
let authorized = CheckPermissionAuth.isLocationAuthorized
settingBtn.setTitle(authorized ? "已设置" : "去设置", for: .normal)
applyActionStyle(isEnabled: !authorized)
case .screenTime:
let authorized = CheckPermissionAuth.isScreenTimeAuthorized
settingBtn.setTitle(authorized ? "开启成功" : "去设置", for: .normal)
applyActionStyle(isEnabled: !authorized)
}
}
private func applyActionStyle(isEnabled: Bool) {
settingBtn.isEnabled = isEnabled
if isEnabled {
settingBtn.setTitleColor(.white, for: .normal)
settingBtn.setTitleColor(.white, for: .disabled)
settingBtn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal)
settingBtn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .disabled)
settingBtn.backgroundColor = .clear
} else {
settingBtn.setTitleColor(UIColor(hexStr: "#B5B5B5"), for: .normal)
settingBtn.setTitleColor(UIColor(hexStr: "#B5B5B5"), for: .disabled)
settingBtn.setBackgroundImage(nil, for: .normal)
settingBtn.setBackgroundImage(nil, for: .disabled)
settingBtn.backgroundColor = UIColor(hexStr: "#EDEDED")
}
}
private func setupUI() {
view.backgroundColor = UIColor(hexStr: "#FAFAFA")
view.addSubview(navBgView)
view.addSubview(navView)
view.addSubview(scrollView)
scrollView.addSubview(scrollContentView)
scrollContentView.addSubview(stepImgView)
view.addSubview(settingBtn)
if kind == .location {
view.addSubview(tipsLab)
}
navBgView.layoutChain
.edges(excludingEdge: .bottom)
.height(kNaviHeight)
navView.layoutChain
.edges(excludingEdge: .bottom)
.height(kNaviHeight)
settingBtn.layoutChain
.edgesHorzontal(30)
.bottom(kSafeBottomMargin + 13)
.height(56)
if kind == .location {
tipsLab.layoutChain
.edgesHorzontal(31)
.bottomToTopOfView(settingBtn, offset: -20)
scrollView.layoutChain
.topToBottomOfView(navView, offset: 15)
.edgesHorzontal()
.bottomToTopOfView(tipsLab, offset: -10)
} else {
scrollView.layoutChain
.topToBottomOfView(navView, offset: 15)
.edgesHorzontal()
.bottomToTopOfView(settingBtn, offset: -20)
}
scrollContentView.layoutChain
.edges()
.widthToView(scrollView)
let imageRatio: CGFloat = kind == .location ? (1066.0 / 672.0) : (1014.0 / 672.0)
stepImgView.layoutChain
.top()
.edgesHorzontal(20)
.bottom()
.heightToWidth(imageRatio)
}
lazy var navBgView: UIImageView = {
let iv = UIImageView()
iv.image = UIImage(named: "Common/navBar_bg_2")
iv.contentMode = .scaleAspectFill
return iv
}()
lazy var navView = BaseNavigationView(title: kind == .location ? "权限检测" : "屏幕使用时间")
lazy var scrollView: UIScrollView = {
let view = UIScrollView()
view.backgroundColor = .clear
view.showsVerticalScrollIndicator = false
return view
}()
lazy var scrollContentView: UIView = {
let view = UIView()
view.backgroundColor = .clear
return view
}()
lazy var stepImgView: UIImageView = {
let name = kind == .location ? "CheckPermission/location" : "CheckPermission/screen"
let view = UIImageView(image: UIImage(named: name))
view.contentMode = .scaleAspectFill
view.clipsToBounds = true
return view
}()
lazy var tipsLab: UILabel = {
let label = UILabel()
label.font = .systemFont(ofSize: 10, weight: .regular)
label.textColor = UIColor(hexStr: "#333333")
label.textAlignment = .center
label.numberOfLines = 0
label.isUserInteractionEnabled = true
let text = "根据我们的隐私政策和用户设置,您的位置数据也将与第三方共享,用于研究、定制广告和分析目的。"
let attr = NSMutableAttributedString(string: text)
let range = (text as NSString).range(of: "隐私政策")
attr.addAttribute(.foregroundColor, value: UIColor(hexStr: "#16B3FF"), range: range)
label.attributedText = attr
return label
}()
lazy var settingBtn: UIButton = {
let btn = UIButton(type: .custom)
btn.setTitle("去设置", for: .normal)
btn.titleLabel?.font = FontManager.boboBold(18)
btn.setTitleColor(.white, for: .normal)
btn.setBackgroundImage(UIImage(named: "Common/button_bg_2"), for: .normal)
btn.cornerRadius = 20
btn.clipsToBounds = true
return btn
}()
}