How do I detect that an iOS app is running on a jailbroken phone?

后端 未结 17 1548
情书的邮戳
情书的邮戳 2020-11-22 10:48

If I want my app to behave differently on a jailbroken iPhone, how would I go about determining this?

17条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-22 11:24

    I reworked in Swift 2.3 the solution provided by @Yossi

    public static func jailbroken(application: UIApplication) -> Bool {
        guard let cydiaUrlScheme = NSURL(string: "cydia://package/com.example.package") else { return isJailbroken() }
        return application.canOpenURL(cydiaUrlScheme) || isJailbroken()
    }
    
    
    static func isJailbroken() -> Bool {
    
        if isSimulator {
            return false
        }
    
        let fileManager = NSFileManager.defaultManager()
        if fileManager.fileExistsAtPath("/Applications/Cydia.app") ||
            fileManager.fileExistsAtPath("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
            fileManager.fileExistsAtPath("/bin/bash") ||
            fileManager.fileExistsAtPath("/usr/sbin/sshd") ||
            fileManager.fileExistsAtPath("/etc/apt") ||
            fileManager.fileExistsAtPath("/usr/bin/ssh") {
            return true
        }
    
        if canOpen("/Applications/Cydia.app") ||
            canOpen("/Library/MobileSubstrate/MobileSubstrate.dylib") ||
            canOpen("/bin/bash") ||
            canOpen("/usr/sbin/sshd") ||
            canOpen("/etc/apt") ||
            canOpen("/usr/bin/ssh") {
            return true
        }
    
        let path = "/private/" + NSUUID().UUIDString
        do {
            try "anyString".writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding)
            try fileManager.removeItemAtPath(path)
            return true
        } catch {
            return false
        }
    }
    
    static func canOpen(path: String) -> Bool {
        let file = fopen(path, "r")
        guard file != nil else { return false }
        fclose(file)
        return true
    }
    

提交回复
热议问题