- 獲取設(shè)備電量返回 -1.0
UIDevice.current.isBatteryMonitoringEnabled = true //加上這個(gè),我一般在Appdelegate里寫
let batteryLevel = UIDevice.current.batteryLevel
- 檢查文件是否越獄
extension UIDevice {
var isJailbroken: Bool {
// 如果是在模擬器上運(yùn)行,直接返回 false
if isSimulator() {
return false
}
// 常見的越獄文件路徑檢查
let commonJailbreakPaths = [
"/Applications/Cydia.app",
"/Library/MobileSubstrate/MobileSubstrate.dylib",
"/bin/bash",
"/usr/sbin/sshd",
"/etc/apt",
"/usr/bin/ssh"
]
// 如果發(fā)現(xiàn)這些文件,判斷為越獄
for path in commonJailbreakPaths {
if FileManager.default.fileExists(atPath: path) {
return true
}
}
// 檢查是否能在受限目錄中創(chuàng)建文件
if canCreateTestFile() {
return true
}
// 檢查是否能打開 Cydia URL
if canOpenCydiaURL() {
return true
}
// 檢查是否有動(dòng)態(tài)庫注入
if hasInjectedLibraries() {
return true
}
return false
}
// 判斷是否是模擬器
private func isSimulator() -> Bool {
return TARGET_IPHONE_SIMULATOR != 0
}
// 嘗試在受限目錄中創(chuàng)建測(cè)試文件
private func canCreateTestFile() -> Bool {
let testFilePath = "/private/jailbreak_test.txt"
do {
try "Jailbreak test".write(toFile: testFilePath, atomically: true, encoding: .utf8)
try FileManager.default.removeItem(atPath: testFilePath)
return true
} catch {
return false
}
}
// 檢查是否能打開 Cydia URL
private func canOpenCydiaURL() -> Bool {
guard let url = URL(string: "cydia://package/com.example.package") else { return false }
return UIApplication.shared.canOpenURL(url)
}
// 檢查是否有注入的動(dòng)態(tài)庫
private func hasInjectedLibraries() -> Bool {
guard let environment = getenv("DYLD_INSERT_LIBRARIES") else {
return false
}
let injectedLibraries = String(cString: environment)
// 檢測(cè)常見的越獄庫,可以根據(jù)需要擴(kuò)展
let knownJailbreakLibs = [
"MobileSubstrate.dylib",
"SubstrateInserter.dylib",
"SubstrateLoader.dylib",
"CydiaSubstrate.dylib"
]
for lib in knownJailbreakLibs {
if injectedLibraries.contains(lib) {
return true
}
}
return false
}
}
越獄判斷返回的結(jié)果可能會(huì)有變化,如果長期使用,建議定期檢查一下 或者使用第三方庫)
//pod 'SystemServices'
let isJailbroken = SystemServices.shared().jailbroken != NOTJAIL