You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Swift检测iPhone是否越狱,以防止GPS伪造并强制关闭APP?

Swift实现iPhone越狱检测与强制退出APP

嘿,这个需求我之前做定位风控功能的时候刚好研究过,分享一套实用的实现方案给你,涵盖越狱状态检测和后续的强制退出逻辑,而且是多维度检测,不容易被轻易绕过。

一、多维度检测越狱状态

越狱设备会留下很多特征,单一检测很容易被破解工具绕过,所以我们组合几个核心检测点:

1. 检查越狱专属文件路径

越狱后系统会出现一些默认不存在的文件/目录,比如Cydia的安装路径、APT缓存目录等,我们可以通过文件管理器判断:

private func hasJailbreakFiles() -> Bool {
    let suspiciousPaths = [
        "/Applications/Cydia.app",
        "/private/var/stash",
        "/private/var/lib/apt/",
        "/private/var/cache/apt/",
        "/private/var/mobile/Library/SBSettings/Themes"
    ]
    
    for path in suspiciousPaths {
        if FileManager.default.fileExists(atPath: path) {
            return true
        }
    }
    return false
}

2. 检测是否能执行未授权Shell命令

越狱设备允许运行系统限制的命令,比如查找Cydia的路径,我们可以通过执行Shell命令来验证:

private func canRunRestrictedCommands() -> Bool {
    let process = Process()
    let pipe = Pipe()
    
    process.launchPath = "/usr/bin/which"
    process.arguments = ["cydia"]
    process.standardOutput = pipe
    
    do {
        try process.run()
        let outputData = pipe.fileHandleForReading.readDataToEndOfFile()
        guard let outputString = String(data: outputData, encoding: .utf8), !outputString.isEmpty else {
            return false
        }
        return true
    } catch {
        return false
    }
}

3. 检测是否能打开Cydia协议

越狱设备支持cydia://协议,我们可以尝试判断是否能打开这个URL:

private func canOpenCydiaURL() -> Bool {
    guard let cydiaURL = URL(string: "cydia://") else { return false }
    return UIApplication.shared.canOpenURL(cydiaURL)
}

组合所有检测逻辑

把上面的方法组合起来,提高检测的准确率:

func isDeviceJailbroken() -> Bool {
    return hasJailbreakFiles() || canRunRestrictedCommands() || canOpenCydiaURL()
}

二、检测到越狱后强制关闭APP

如果检测到设备越狱,我们可以先弹出提示告知用户,再强制退出APP。注意:如果你的APP涉及敏感场景(比如金融、定位防作弊),这个逻辑在苹果审核时是可以被接受的,但最好在隐私政策里说明原因。

可以把检测逻辑放在AppDelegate的启动方法里,或者首页的viewDidLoad中:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    if isDeviceJailbroken() {
        let alert = UIAlertController(title: "无法使用", message: "当前设备已越狱,为保障安全,本应用无法继续运行", preferredStyle: .alert)
        alert.addAction(UIAlertAction(title: "确定", style: .default, handler: { _ in
            // 强制退出APP
            exit(0)
        }))
        
        // 确保弹窗能正常显示
        if let rootVC = application.windows.first?.rootViewController {
            rootVC.present(alert, animated: true)
        } else {
            // 如果根控制器未初始化,直接退出
            exit(0)
        }
    }
    return true
}

额外注意事项

  • 定期检测:除了启动时检测,还可以在APP运行过程中定期(比如进入敏感页面时)再次检测,防止用户在APP启动后才越狱。
  • 审核备注:提交苹果审核时,如果有强制退出逻辑,一定要在审核备注里说明你的APP场景(比如防定位作弊、金融安全),避免被拒。
  • 避免过度检测:不要添加一些会影响正常用户体验的检测逻辑,比如频繁读取系统文件。

内容的提问来源于stack exchange,提问作者Agung

火山引擎 最新活动