2012-09-09 22 views
7

Tôi đang cố gắng tạo một ứng dụng hoạt động tốt trên iDevices đã bẻ khóa. Tôi allready đã thực hiện một phát hiện jailbreak:Không phát hiện jailbreak

([[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]; 
}} 

Nhưng bây giờ tôi cần điều ngược lại. Tôi cần phát hiện NON JAILBREAK.

Tôi cần bạn trợ giúp tôi cần điều này cho Weblin. Làm ơn giúp tôi!!!

+2

Tại sao phát hiện các thiết bị đã bẻ khóa nếu nó chỉ hoạt động trên chúng? Nếu bạn có thể cài đặt ứng dụng từ nguồn khác thì appstore, thì đó là một thiết bị bẻ khóa. – Sulthan

Trả lời

8

Thử truy cập bất kỳ tệp nào bên ngoài hộp cát của ứng dụng. Ví dụ:

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

Lưu ý rằng việc Cydia cài đặt và có thiết bị bẻ khóa là hai điều khác nhau.

5

Tôi đã viết một chức năng phát hiện cho dù thiết bị được jailbroken cho một câu hỏi khác, nhưng có vẻ như đây có liên quan:

- (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 
} 

Chức năng này sử dụng hai kiểm tra xem nếu điện thoại được jailbroken: nó kiểm tra đầu tiên nếu Cydia được cài đặt. Không phải tất cả các thiết bị bẻ khóa đều có Cydia được cài đặt, mặc dù hầu hết đều làm, vì vậy tôi cũng kiểm tra sự tồn tại của bash, cũng chỉ xuất hiện trên các thiết bị đã bẻ khóa. Lưu ý rằng chức năng này sẽ hoạt động trong hầu hết các trường hợp, nhưng có thể không phải là 100%. Những người duy nhất không có Cydia trên iDevice đã bẻ khóa của họ có lẽ là những người đang thử nghiệm với các thiết bị bẻ khóa và không sử dụng chúng vì những ưu điểm như chỉnh sửa và chủ đề.

+1

không nên 'isJailbroken' là' CÓ' nếu 'cydiaInstalled'? bạn có một '!' trước 'cydiaInstalled' trong mã của bạn. – Nate

+0

@Nate - Cảm ơn vì điều đó. Đoán tôi chỉ bỏ qua điều đó. – pasawaya

+0

Không thể "&&" là "||" và tại sao kiểm tra "/ bin/bash" ở tất cả, khi chúng tôi đã tìm thấy Cydia.app? – Andreas

3

OK cảm ơn tất cả các câu trả lời nhưng tôi đã tự mình tìm ra câu trả lời. Đây là mã:

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 
} 

Với mã này, bạn có thể phát hiện bất kỳ ứng dụng trên iDevice của bạn miễn là ứng dụng có giao thức URL bạn có thể tìm thấy hầu hết các thức truy cập URL ở đây: http://handleopenurl.com

PS: Bạn phải thay thế phần màu xanh lá cây bằng hành động của bạn :)

+0

Giống như tôi đã nói trong câu trả lời của tôi, việc mở Cydia không phải là một phương pháp chính xác để kiểm tra xem thiết bị có bị bẻ khóa hay không bởi vì không phải mọi iDevice đã jailbreak đã cài đặt Cydia. – pasawaya

+0

Nhưng người dùng bình thường đã cài đặt cydia :) – user1658674

+0

Đó là sự thật, và tôi chắc chắn rằng bạn đang nhắm mục tiêu đến cơ sở người dùng này, vì vậy cho mục đích của bạn chỉ kiểm tra Cydia là tốt. – pasawaya

Các vấn đề liên quan