2014-12-02 16 views
10

Próbuję włączyć/wyłączyć części mojego kodu na podstawie tego, czy kod jest uruchamiany przez USB/Xcode (debugowanie), czy w trybie produkcyjnym pobranym z aplikacji sklep (wydanie). Jestem świadomy sprawdzenie, czy jest on uruchomiony w trybie DEBUG lub RELEASE tak:iOS - wykrywanie, czy aplikacja działa pod Xcode

enter image description here

#ifdef DEBUG 

// Stuff for debug mode 

#else 

// Stuff for release mode 

#endif 

ale problemem jest to, że oczywistym loop-hole widzę to można zmienić konfigurację budowania schemat uruchamiania "Uruchom" z "Debuguj" do "Zwolnij". Lepszym sposobem byłoby, gdybym po prostu wykrył, czy działa z Xcode, czy nie. Nie znalazłem sposobu, aby to sprawdzić.

Czy istnieje sposób sprawdzenia, czy aplikacja na iOS działa z Xcode, czy nie?

+0

Twoje pytanie jest ważne - Mogę sobie wyobrazić, że chcesz, aby wykryć, czy dana aplikacja jest uruchomiona DEBUG z Xcode podłączony czy nie. Ale twoje powody są wątpliwe - dlaczego chciałbyś w ten sposób zmienić konfigurację Build? – fishinear

+0

Pytasz, dlaczego należałoby zmienić konfigurację "Uruchom" kompilacji z domyślnej "Debuguj" na "Zwolnij"? Zauważyłem, że jest to dobra praktyka przed przesłaniem aplikacji do sklepu z aplikacjami, ponieważ widziałem usterki pojawiające się w trybie Release, które nie istnieją w trybie debugowania. –

+0

Kompilacja wydania nie pozwala na łączenie się XCode z aplikacją - przynajmniej w moim przypadku. Czy to dla ciebie coś innego? – fishinear

Odpowiedz

16

Możesz sprawdzić, czy dołączony jest debugger (prawdopodobnie, ale nie definitywnie, Xcode) używając sysctl. Oto jak HockeyApp does it:

#include <Foundation/Foundation.h> 
#include <sys/sysctl.h> 

/** 
* Check if the debugger is attached 
* 
* Taken from https://github.com/plausiblelabs/plcrashreporter/blob/2dd862ce049e6f43feb355308dfc710f3af54c4d/Source/Crash%20Demo/main.m#L96 
* 
* @return `YES` if the debugger is attached to the current process, `NO` otherwise 
*/ 
- (BOOL)isDebuggerAttached { 
    static BOOL debuggerIsAttached = NO; 

    static dispatch_once_t debuggerPredicate; 
    dispatch_once(&debuggerPredicate, ^{ 
    struct kinfo_proc info; 
    size_t info_size = sizeof(info); 
    int name[4]; 

    name[0] = CTL_KERN; 
    name[1] = KERN_PROC; 
    name[2] = KERN_PROC_PID; 
    name[3] = getpid(); // from unistd.h, included by Foundation 

    if (sysctl(name, 4, &info, &info_size, NULL, 0) == -1) { 
     NSLog(@"[HockeySDK] ERROR: Checking for a running debugger via sysctl() failed: %s", strerror(errno)); 
     debuggerIsAttached = false; 
    } 

    if (!debuggerIsAttached && (info.kp_proc.p_flag & P_TRACED) != 0) 
     debuggerIsAttached = true; 
    }); 

    return debuggerIsAttached; 
} 
+0

Idealny. Dziękuję Ci! –

+0

Pamiętaj, że musisz #include dla getpid() – Ryan

+0

@Ryan Tylko jeśli nie używasz podstawki, którą prawdopodobnie używasz, jeśli używasz GCD, składni obiektów, BOOL włącznie z YES i NO. Ale zwrócę uwagę na zależność od Fundacji. :) –

Powiązane problemy