64 lines
1.8 KiB
Swift
64 lines
1.8 KiB
Swift
|
|
//
|
||
|
|
// UIDevice+Ext.swift
|
||
|
|
// LegendTeam
|
||
|
|
//
|
||
|
|
// Created by lym on 2022/2/16.
|
||
|
|
//
|
||
|
|
|
||
|
|
import Foundation
|
||
|
|
import UIKit
|
||
|
|
import UICKeyChainStore
|
||
|
|
|
||
|
|
extension UIDevice {
|
||
|
|
static var UUID: String {
|
||
|
|
let service = Bundle.appBundleID + ".uuid"
|
||
|
|
let key = Bundle.appBundleID + ".uuid" + ".key"
|
||
|
|
let keychain = UICKeyChainStore(service: service)
|
||
|
|
if let uuid = keychain.string(forKey: key) {
|
||
|
|
return uuid
|
||
|
|
}
|
||
|
|
// 8-4-4-4-12
|
||
|
|
// F9C5E3F8-2396-435E-AD11-02446C943FB2
|
||
|
|
var uuid2 = UIDevice.current.identifierForVendor?.uuidString
|
||
|
|
if uuid2 == nil {
|
||
|
|
let timeInterval = Int(Date().timeIntervalSince1970)
|
||
|
|
uuid2 = String.randomString(8)
|
||
|
|
+ "-" + String.randomString(4)
|
||
|
|
+ "-" + String.randomString(4)
|
||
|
|
+ "-" + String.randomString(4)
|
||
|
|
+ "-" + "\(timeInterval)" + String.randomString(2)
|
||
|
|
}
|
||
|
|
keychain.setString(uuid2, forKey: key)
|
||
|
|
return uuid2!
|
||
|
|
}
|
||
|
|
|
||
|
|
var isPhone: Bool {
|
||
|
|
return userInterfaceIdiom == .phone
|
||
|
|
}
|
||
|
|
|
||
|
|
var isPad: Bool {
|
||
|
|
return userInterfaceIdiom == .pad
|
||
|
|
}
|
||
|
|
|
||
|
|
var isSimulator: Bool {
|
||
|
|
#if targetEnvironment(simulator)
|
||
|
|
return true
|
||
|
|
#else
|
||
|
|
return false
|
||
|
|
#endif
|
||
|
|
}
|
||
|
|
|
||
|
|
var hasNotch: Bool {
|
||
|
|
if #available(iOS 15.0, *) {
|
||
|
|
// Use UIWindowScene.windows for iOS 15 and later
|
||
|
|
let windowScene = UIApplication.shared.connectedScenes
|
||
|
|
.compactMap { $0 as? UIWindowScene }
|
||
|
|
.first
|
||
|
|
return windowScene?.windows.first?.safeAreaInsets.bottom ?? 0 > 0
|
||
|
|
} else {
|
||
|
|
// Fallback for iOS versions before 15.0
|
||
|
|
return UIApplication.shared.windows.first?.safeAreaInsets.bottom ?? 0 > 0
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|