iOS 判断设备是否越狱

我们在开发过程中,需要知道设备是否越狱,在网上查看很多资料,为此封装一些判断的方法。

上代码,不解释:

.h文件

#import <Foundation/Foundation.h>

@interface JailBroken : NSObject

/**
 *  1. 判定常见的越狱文件
 */
- (BOOL)isJailBrokenOne;

/**
 *  2. 判断cydia的URL scheme
 */
- (BOOL)isJailBrokenTwo;

/**
 *  3. 读取系统所有应用的名称
 */
- (BOOL)isJailBrokenThree;

/**
 *  4. 使用stat方法来判定cydia是否存在
 */
- (BOOL)isJailBrokenFour;

/**
 *  5. 读取环境变量
 */
- (BOOL)isJailBrokenFive;

@end

.m 文件

#import "JailBroken.h"
#import "AppDelegate.h"
#import <sys/stat.h>
#import<dlfcn.h>
#import <dlfcn.h>

#define ARRAY_SIZE(a)    sizeof(a)/sizeof(a[0])
#define USER_APP_PATH    @"/User/Applications/"
#define CYDIA_APP_PATH   "/Applications/Cydia.app"
#define APT_APP_PATH     "/private/var/lib/apt/"

const char* jailbreak_tool_pathes[] = {
    "/Applications/Cydia.app",
    "/Library/MobileSubstrate/MobileSubstrate.dylib",
    "/etc/apt"
};

@implementation JailBroken

/**
 *  1. 判定常见的越狱文件
 */
- (BOOL)isJailBrokenOne {
    for (int i=0; i<ARRAY_SIZE(jailbreak_tool_pathes); i++) {
        if ([[NSFileManager defaultManager] fileExistsAtPath:[NSString stringWithUTF8String:jailbreak_tool_pathes[i]]]) {
            NSLog(@"1 The device is jailbroken!");
            return YES;
        }
    }
    NSLog(@"1 The device is not jailbroken!");
    return NO;
}

//- (BOOL)isJailBrokenOne {
//    if ([[NSFileManager defaultManager] fileExistsAtPath:@"/etc/apt"]) {
//        NSLog(@"1 The device is jailbroken!");
//        return YES;
//    }
//
//    NSLog(@"1 The device is not jailbroken!");
//    return NO;
//}

/**
 *  2. 判断cydia的URL scheme
 */
- (BOOL)isJailBrokenTwo {
    if ([[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:@"cydia://"]]) {
        NSLog(@"2 The device is jailbroken!");
        return YES;
    }
    NSLog(@"2 The device is not jailbroken!");
    return NO;
}

/**
 *  3. 读取系统所有应用的名称
 */
- (BOOL)isJailBrokenThree {
    if ([[NSFileManager defaultManager] fileExistsAtPath:USER_APP_PATH]) {
        NSLog(@"3 The device is jailbroken!");
        NSArray *list = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:USER_APP_PATH error:nil];
        NSLog(@"list = %@",list);
        return YES;
    }
    NSLog(@"3 The device is not jailbroken!");
    return NO;
}

/**
 *  4. 使用stat方法来判定cydia是否存在
 */
- (BOOL)isJailBrokenFour {
    if (checkCydia()) {
        NSLog(@"4 The device is jailbroken!");
        return YES;
    }
    NSLog(@"4 The device is not jailbroken!");
    return NO;
}

/**
 *  5. 读取环境变量
 */
- (BOOL)isJailBrokenFive {
    if (printEnv()) {
        NSLog(@"5 The device is jailbroken!");
        return YES;
    }
    NSLog(@"5 The device is not jailbroken!");
    return NO;
}



#pragma mark - Private

int checkInject()
{
    int ret;
    Dl_info dylib_info;
    int (*func_stat)(const char*, struct stat*) = stat;
    
    if ((ret = dladdr(func_stat, &dylib_info))) {
        return 0;
    }
    return 1;
}

int checkCydia()
{
    // first ,check whether library is inject
    struct stat stat_info;
    
    if (!checkInject()) {
        if (0 == stat(CYDIA_APP_PATH, &stat_info) ||(0 == stat(APT_APP_PATH, &stat_info))) {
            return 1;
        }
    } else {
        return 1;
    }
    return 0;
}

char* printEnv(void)
{
    char *env = getenv("DYLD_INSERT_LIBRARIES");
    NSLog(@"%s", env);
    return env;
}

@end

在AppDelegate.m 文件

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    JailBroken *jb = [[JailBroken alloc] init];
    
    if ( [jb isJailBrokenOne] || [jb isJailBrokenTwo] || [jb isJailBrokenThree] || [jb isJailBrokenFour] || [jb isJailBrokenFive] ) {
        NSLog(@"越狱!!!");
    }
    else {
        NSLog(@"未越狱!!!");
    }
    
    return YES;
}
原文地址:https://www.cnblogs.com/DWdan/p/4797854.html