我刚发布了我的iOS应用程序,但我不确定如何使我的应用程序免受越狱的影响。
我能做些什么来防止我的应用在越狱设备上运行?
我刚发布了我的iOS应用程序,但我不确定如何使我的应用程序免受越狱的影响。
我能做些什么来防止我的应用在越狱设备上运行?
您可以通过代码检测应用是否在越狱设备上运行。通过这种方式,您可以弹出警报并关闭应用程序。您可以按照以下教程进行操作:
http://thwart-ipa-cracks.blogspot.com/2008/11/detection.html
另外,以下是一个 Stack Overflow 帖子:
How do I detect that an iOS app is running on a jailbroken phone?
如果您想获得完整的解决方案,您可以查看 Tapjoy SDK 代码。他们正在检测越狱的 iPhone。以下是 Tapjoy 的网址:https://www.tapjoy.com/
检查这些路径
+ (BOOL)isJailBroken {
#ifdef TARGET_IPHONE_SIMULATOR
return NO;
#endif
NSArray *paths = @[@"/bin/bash",
@"/usr/sbin/sshd",
@"/etc/apt",
@"/private/var/lib/apt/",
@"/Applications/Cydia.app",
];
for (NSString *path in paths) {
if ([self fileExistsAtPath:path]) {
return YES;
}
}
return NO;
}
+ (BOOL)fileExistsAtPath:(NSString *)path {
FILE *pFile;
pFile = fopen([path cStringUsingEncoding:[NSString defaultCStringEncoding]], "r");
if (pFile == NULL) {
return NO;
}
else
fclose(pFile);
return YES;
}
/**
Detect that the app is running on a jailbroken device or not
- returns: bool value for jailbroken device or not
*/
public class func isDeviceJailbroken() -> Bool {
#if arch(i386) || arch(x86_64)
return false
#else
let fileManager = FileManager.default
if (fileManager.fileExists(atPath: "/bin/bash") ||
fileManager.fileExists(atPath: "/usr/sbin/sshd") ||
fileManager.fileExists(atPath: "/etc/apt") ||
fileManager.fileExists(atPath: "/private/var/lib/apt/") ||
fileManager.fileExists(atPath: "/Applications/Cydia.app") ||
fileManager.fileExists(atPath: "/Library/MobileSubstrate/MobileSubstrate.dylib")) {
return true
} else {
return false
}
#endif
}
尝试查找由Cydia或越狱设备创建的文件。或者尝试在应用程序黑盒之外的文件中写入内容。如果您成功做到这一点,则设备已被破解/越狱 :)
- (BOOL)jailbroken
{
NSFileManager * fileManager = [NSFileManager defaultManager];
return [fileManager fileExistsAtPath:@"/private/var/lib/apt/"];
}
基于@karim的回答,这是一个稍微修改过的swift版本:
func hasJailbreak() -> Bool {
#if arch(i386) || arch(x86_64)
println("Simulator")
return false
#else
var fileManager = NSFileManager.defaultManager()
if(fileManager.fileExistsAtPath("/private/var/lib/apt")) {
println("Jailbroken Device")
return true
} else {
println("Clean Device")
return false
}
#endif
}
-(BOOL) isJailbroken
{
#if TARGET_IPHONE_SIMULATOR
return NO;
#else
FILE *f = fopen("/bin/bash", "r");
if (errno == ENOENT)
{
// device is NOT jailbroken
fclose(f);
NSLog(@"no");
return NO;
}
else {
// device IS jailbroken
fclose(f);
NSLog(@"yes");
return YES;
}
#endif
}
无法检测设备是否越狱。
即使有方法,设备已经越狱,意味着可以执行任意代码,而越狱者会修改您使用的任何检测方法,以信号表明设备未被越狱。
reference: https://forums.developer.apple.com/thread/43073
感谢回答这个问题的苹果员工们。
有许多方法可以找到越狱设备。如果技术熟练的黑客更改了应用程序路径,检查Cydia技术将无法使用。
一个好的方法是检查是否可以修改应用程序包之外某个其他位置的文件。
NSError *error;
NSString *stringToBeWritten = @"This is a test.";
[stringToBeWritten writeToFile:@"/private/jailbreak.txt" atomically:YES
encoding:NSUTF8StringEncoding error:&error];
if(error==nil){
//Device is jailbroken
return YES;
} else {
//Device is not jailbroken
[[NSFileManager defaultManager] removeItemAtPath:@"/private/jailbreak.txt" error:nil];
}
在下面的链接中找到更多的技术