iOS开发记录 随时更新

  • 获取设备电量返回 -1.0
UIDevice.current.isBatteryMonitoringEnabled = true  //加上这个,我一般在Appdelegate里写
let batteryLevel = UIDevice.current.batteryLevel
  • 检查文件是否越狱
extension UIDevice {
    var isJailbroken: Bool {
        // 如果是在模拟器上运行,直接返回 false
        if isSimulator() {
            return false
        }
        
        // 常见的越狱文件路径检查
        let commonJailbreakPaths = [
            "/Applications/Cydia.app",
            "/Library/MobileSubstrate/MobileSubstrate.dylib",
            "/bin/bash",
            "/usr/sbin/sshd",
            "/etc/apt",
            "/usr/bin/ssh"
        ]
        
        // 如果发现这些文件,判断为越狱
        for path in commonJailbreakPaths {
            if FileManager.default.fileExists(atPath: path) {
                return true
            }
        }
        
        // 检查是否能在受限目录中创建文件
        if canCreateTestFile() {
            return true
        }
        
        // 检查是否能打开 Cydia URL
        if canOpenCydiaURL() {
            return true
        }
        
        // 检查是否有动态库注入
        if hasInjectedLibraries() {
            return true
        }
        
        return false
    }
    
    // 判断是否是模拟器
    private func isSimulator() -> Bool {
        return TARGET_IPHONE_SIMULATOR != 0
    }
    
    // 尝试在受限目录中创建测试文件
    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)
    }
    
    // 检查是否有注入的动态库
    private func hasInjectedLibraries() -> Bool {
        guard let environment = getenv("DYLD_INSERT_LIBRARIES") else {
            return false
        }
        
        let injectedLibraries = String(cString: environment)
        
        // 检测常见的越狱库,可以根据需要扩展
        let knownJailbreakLibs = [
            "MobileSubstrate.dylib",
            "SubstrateInserter.dylib",
            "SubstrateLoader.dylib",
            "CydiaSubstrate.dylib"
        ]
        
        for lib in knownJailbreakLibs {
            if injectedLibraries.contains(lib) {
                return true
            }
        }
        
        return false
    }
}

越狱判断返回的结果可能会有变化,如果长期使用,建议定期检查一下 或者使用第三方库)

//pod 'SystemServices'
let isJailbroken = SystemServices.shared().jailbroken != NOTJAIL
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容