我正在努力制作一款适用于越狱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];
}}
但现在我需要相反的事情。我需要非JAILBREAK检测。
我需要你的帮助我需要这个用于Weblin。请帮帮我!!!
答案 0 :(得分:8)
尝试访问应用沙箱外的任何文件。例如:
BOOL IsDeviceJailbroken(void) {
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
return [[NSFileManager defaultManager] fileExistsAtPath: @"/bin/bash"];
#endif
}
请注意,安装Cydia并使用越狱设备是两回事。
答案 1 :(得分: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的人可能就是那些正在尝试使用越狱设备并且没有使用它们来获得调整和主题等优点的人。
答案 2 :(得分: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:你必须用你的行动替换绿色部分:)
答案 3 :(得分: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/>