8

我正在尝试制作一个仅适用于越狱 iDevices 的应用程序。我已经有越狱检测代码:

([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]);{
    UIAlertView *cydiaisinstalled=[[UIAlertView alloc]initWithTitle:@"Cydia is installed!"
                                                            message:@"You can use Respring!"
                                                           delegate:self
                                                  cancelButtonTitle:@"OK"
                                                  otherButtonTitles:nil];
    [cydiaisinstalled show];
}}

但现在我需要能够检测设备是否未越狱。

4

4 回答 4

8

尝试访问应用程序沙箱之外的任何文件。例如:

BOOL IsDeviceJailbroken(void) {
    #if TARGET_IPHONE_SIMULATOR
    return NO;
    #else
    return [[NSFileManager defaultManager] fileExistsAtPath: @"/bin/bash"];
    #endif
}

请注意,安装 Cydia 和拥有越狱设备是两件事。

于 2012-09-09T20:23:23.493 回答
6

我编写了一个函数来检测设备是否因另一个问题而越狱,但在这里似乎相关:

- (BOOL) isJailbroken() {

    //If the app is running on the simulator
    #if TARGET_IPHONE_SIMULATOR
        return NO;

    //If its running on an actual device
    #else
        BOOL isJailbroken = NO;

        //This line checks for the existence of Cydia
        BOOL cydiaInstalled = [[NSFileManager defaultManager] fileExistsAtPath:@"/Applications/Cydia.app"];

        FILE *f = fopen("/bin/bash", "r");

        if (!(errno == ENOENT) || cydiaInstalled) {

            //Device is jailbroken
            isJailbroken = YES;
        }            
        fclose(f);
        return isJailbroken;
    #endif
}

该功能使用两个检查来查看手机是否越狱:它首先检查是否安装了 Cydia。并非所有越狱设备都安装了 Cydia,尽管大多数都安装了,所以我还检查了 bash 的存在,它也只出现在越狱设备上。请注意,此功能几乎适用于所有情况,但可能不是 100%。唯一在越狱的 iDevice 上没有 Cydia 的人可能是那些正在尝试越狱设备而不是使用它们来获得调整和主题等优势的人。

于 2012-09-09T23:06:31.440 回答
3

好的,感谢所有答案,但我自己发现了。这是代码:

if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
    //insert action if cydia is installed
}
if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]] == NO) {
    //insert action if Cydia is not installed
}

使用此代码,您可以检测 idevice 上的任何应用程序,只要该应用程序具有 URL 方案,您可以在此处找到大部分 URL 方案:http: //handleopenurl.com

PS:你必须用你的动作替换绿色部分:)

于 2012-10-16T20:28:57.400 回答
0

对于那些在 2021 年来到这里的人来说,这是一种非常快速的方法来检测您是否已越狱,并且与其他答案不同,这将有助于处理现有的所有数十种不同的越狱:

FILE * filepath = fopen("/var/mobile/test-jb", "w");
    
    if (!filepath) {
        fclose(filepath);
        fprintf(stderr,"Random processes are running sandboxed. Not jailbroken\n");
        return -2;
    }
    
    printf("Detected sandbox escape. This device is likely jailbroken.\n");
    fclose(filepath);

这样做的目的是尝试将测试文件写入/var/mobile. 如果您越狱并拥有适当的权利,它通常可以工作。在未越狱的设备上,这将deny()在控制台中失败。

确保您使用以下权利签署您的应用程序:

<key>com.apple.private.security.no-container</key>
    <true/>
<key>platform-application</key>
    <true/>
于 2021-04-07T09:42:52.097 回答