jsdw_ios/QuickLocation/Common/Constant.swift

167 lines
6.6 KiB
Swift
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//
// Constant.swift
// DLSDK
//
// Created by osell on 2023/3/6.
//
import Foundation
import SwiftyUserDefaults
/// NSUserDefaults 常量
extension DefaultsKeys {
/// 当前经纬度
var currentLatitude: DefaultsKey<Double?> { .init("currentLatitude") }
var currentLongitude: DefaultsKey<Double?> { .init("currentLongitude") }
/// 是否自动更新位置
var updateLocationEnable: DefaultsKey<Bool> { .init("updateLocationEnable", defaultValue: true) }
/// 是否从第三方应用跳回
var isVendorCallback: DefaultsKey<Bool> { .init("isVendorCallback", defaultValue: false) }
/// 重新登录(IM需要获取id和签名)
var isReLogin: DefaultsKey<Bool> { .init("isReLogin", defaultValue: false) }
/// 显示引导页
var isShowGuide: DefaultsKey<Bool> { .init("isShowGuide", defaultValue: true) }
/// 启动页已同意服务协议及隐私政策
var didAgreeLaunchPrivacy: DefaultsKey<Bool> { .init("didAgreeLaunchPrivacy", defaultValue: false) }
/// 气泡持续时间
var bubbleKeepTimes: DefaultsKey<Date?> { .init("bubbleKeepTimes") }
/// 屏幕使用时间权限曾开启的账号
var appRestrictApprovedUserIds: DefaultsKey<[String]> { .init("appRestrictApprovedUserIds", defaultValue: []) }
/// 等待执行服务端配对全删的账号
var appRestrictPendingDeleteUserIds: DefaultsKey<[String]> { .init("appRestrictPendingDeleteUserIds", defaultValue: []) }
/// 当前本地配对数据所属账号
var appRestrictPairingOwnerUserId: DefaultsKey<String> { .init("appRestrictPairingOwnerUserId", defaultValue: "") }
/// 飞鸽发送成功时间戳(秒),key = userId
var pigeonSendAtByUser: DefaultsKey<[String: [Double]]> { .init("pigeonSendAtByUser", defaultValue: [:]) }
}
/// 通知常量
extension Notification.Name {
/// 刷新用户config
static let RefreshUserConfigNotification = Notification.Name("RefreshUserConfigNotification")
/// 刷新用户圈子数据
static let RefreshGroupInfoNotification = Notification.Name("RefreshGroupInfoNotification")
/// 刷新IM圈子列表数据
static let RefreshIMGroupListNotification = Notification.Name("RefreshIMGroupListNotification")
/// 圈子聊天记录已清空
static let GroupChatHistoryDidClearNotification = Notification.Name("GroupChatHistoryDidClearNotification")
/// 查看成员位置
static let ShowMemberLocationNotification = Notification.Name("ShowMemberLocationNotification")
/// 暂停弹窗队列(第三方登录/注册跳转时)
static let pausePopupQueue = Notification.Name("pausePopupQueue")
/// 恢复弹窗队列(第三方登录取消/失败时)
static let resumePopupQueue = Notification.Name("resumePopupQueue")
/// 终止弹窗队列(登录成功后)
static let invalidatePopupQueue = Notification.Name("invalidatePopupQueue")
/// 本机应用配对数据变化
static let appRestrictPairingDataDidChange = Notification.Name("appRestrictPairingDataDidChange")
/// MQTT 应用锁定状态变化
static let lockDistractAppsDidChange = Notification.Name("lockDistractAppsDidChange")
/// 本机手机状态(电量/网络/亮度/音量等)变化
static let phoneStatusDidChange = Notification.Name("phoneStatusDidChange")
}
enum GroupDataChangeUserInfoKey {
static let groupKey = "group_key"
static let userId = "user_id"
static let operation = "operation"
static let source = "source"
}
enum GroupDataChangeSource {
static let api = "api"
static let mqtt = "mqtt"
}
enum LockDistractAppsChangeUserInfoKey {
static let groupKey = "group_key"
static let userId = "user_id"
}
// MARK: - 普通常量
/// KeyWindow
public var kKeyWindow: UIWindow? { UIApplication.keyWindow }
/// KeyWindow安全区域
public var kSafeAreaInsets: UIEdgeInsets { kKeyWindow?.safeAreaInsets ?? .zero }
/// 屏幕size
public let kScreenSize = UIScreen.main.bounds.size
/// 屏幕宽度
public let kScreenWidth = UIScreen.main.bounds.size.width
/// 屏幕高度
public let kScreenHeight = UIScreen.main.bounds.size.height
/// 状态栏高度
public var kStatusBarHeight: CGFloat {
if let height = kKeyWindow?
.windowScene?
.statusBarManager?
.statusBarFrame
.height,
height > 1 {
return height
}
let safeTop = kKeyWindow?.safeAreaInsets.top ?? 0
if safeTop > 1 {
return safeTop
}
return kScreenHeight >= 812 ? 47 : 20
}
/// 顶部导航+状态栏高度
public var kNaviHeight: CGFloat { 44 + kStatusBarHeight }
/// App显示名称
public let kAppName = Bundle.main.infoDictionary!["CFBundleDisplayName"] as! String //App 名称
/// App的Bundle版本
public let kAppVersion = Bundle.main.infoDictionary!["CFBundleVersion"] as! String //App 版本
/// App的BundleShort版本
public let kAppShortVersion = Bundle.main.infoDictionary!["CFBundleShortVersionString"] as! String
/// App的Identifier
public let kBundleIdentifier = Bundle.main.infoDictionary!["CFBundleIdentifier"] as! String
public let kIsFullScreen = kScreenHeight > 800 ? true : false
public let kSafeBottomMargin: CGFloat = kIsFullScreen ? 34.0 : 0.0
/// 每页显示条数
public let kPageSize = 20
/// 同步锁
/// - Parameters:
/// - lock: 加锁对象
/// - closure: 执行操作
public func synchronized(_ lock: Any, closure: () -> ()) {
objc_sync_enter(lock)
closure()
objc_sync_exit(lock)
}
/// 主线程执行
/// - Parameter closure: 执行代码
public func MainAsync(_ closure: (() -> Void)?) {
guard let closure = closure else { return }
Thread.isMainThread ? closure() : DispatchQueue.main.async(execute: closure)
}
/// 全局队列
/// - Parameter closure: 执行代码
public func GlobalAsync(qos: DispatchQoS.QoSClass = .default, _ closure: (() -> Void)?) {
guard let closure = closure else { return }
Thread.isMultiThreaded() ? closure() : DispatchQueue.global(qos: qos).async(execute: closure)
}
extension DL {
/// 安全字符串,不为nil
public static func safeString(_ value: Any?) -> String {
guard let value = value, !(value is NSNull) else { return "" }
if let string = value as? String { return string }
if let data = value as? Data { return String(data: data, encoding: .utf8) ?? "" }
if let object = value as? NSObjectProtocol { return object.description }
return String(describing: value)
}
/// 安全数字,不为nil
public static func safeNumber(_ value: Any?) -> NSNumber {
guard let value = value else { return NSNumber(value: 0) }
if let number = value as? NSNumber { return number }
return safeString(value).number ?? NSNumber(value: 0)
}
}