2014-12-02 19 views
10

Sto tentando di abilitare/disabilitare parti del mio codice in base al fatto che il codice venga eseguito tramite USB/Xcode (debug) o in modalità di produzione scaricata dall'app store (versione). Sono consapevole di verificare se è in esecuzione in DEBUG o RELEASE modo simile a questo:iOS - rileva se l'app è in esecuzione da Xcode

enter image description here

#ifdef DEBUG 

// Stuff for debug mode 

#else 

// Stuff for release mode 

#endif 

ma il problema è che un evidente feritoia che vedo è che si può cambiare la configurazione per la lo schema di build "Esegui" da "Debug" a "Release". Un modo migliore sarebbe se posso semplicemente rilevare se è in esecuzione da Xcode o no. Non ho trovato un modo per verificare questo.

C'è un modo per verificare se un'app per iOS è in esecuzione da Xcode o no?

+0

La tua domanda è valida - posso immaginare che si desidera rilevare se un'applicazione è in esecuzione con DEBUG XCode collegato o meno. Ma le tue ragioni sono discutibili - perché ti piacerebbe mai cambiare la configurazione di build in quel modo? – fishinear

+0

Stai chiedendo perché uno cambierebbe la configurazione di configurazione "Esegui" dal predefinito "Debug" a "Rilascia"? Ho trovato che sia una buona pratica prima di inviare un'app all'app store perché ho visto degli errori spuntare in modalità di rilascio che non esistono in modalità debug. –

+0

La versione Release non consente a XCode di connettersi all'app, almeno nel mio caso. È diverso per te? – fishinear

risposta

16

È possibile verificare se un debugger è collegato (probabilmente, ma non definitivamente, Xcode) utilizzando sysctl. Ecco come 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

Perfetto. Grazie! –

+0

Nota è necessario #include per getpid() – Ryan

+0

@Ryan Solo se non si include Foundation, che probabilmente si è se si utilizza GCD, sintassi di oggetto, BOOL compreso SÌ e NO. Ma noterò la dipendenza dalla Fondazione. :) –

Problemi correlati