2014-12-02 21 views
10

Ich versuche Teile meines Codes zu aktivieren/deaktivieren, basierend darauf, ob der Code über USB/Xcode (debuggen) oder im Produktionsmodus von der App heruntergeladen wird speichern (release). Ich bin mir dessen bewusst zu überprüfen, ob es in DEBUG oder RELEASE Modus wie folgt ausgeführt werden:iOS - erkennen, ob App läuft von Xcode

enter image description here

#ifdef DEBUG 

// Stuff for debug mode 

#else 

// Stuff for release mode 

#endif 

aber das Problem ist, dass ein offensichtliches Schlupfloch ich sehe ist, dass Sie die Build-Konfiguration ändern kann das 'Run'-Build-Schema von' Debug 'bis' Release '. Ein besserer Weg wäre, wenn ich einfach feststellen könnte, ob es von Xcode läuft oder nicht. Ich habe keine Möglichkeit gefunden, dies zu überprüfen.

Gibt es eine Möglichkeit zu überprüfen, ob eine iOS-App von Xcode ausgeführt wird oder nicht?

+0

Ihre Frage gültig ist - ich kann mir vorstellen, dass Sie möchten, erkennen, ob ein DEBUG-App mit XCode verbunden läuft oder nicht. Aber deine Gründe sind zweifelhaft - warum würdest du jemals die Build-Konfiguration auf diese Weise ändern wollen? – fishinear

+0

Fragen Sie, warum man die 'Run' Build-Konfiguration von der Standard 'Debug' in 'Release' ändern würde? Ich habe festgestellt, dass es eine gute Übung ist, bevor ich eine App an den App Store übergebe, da im Debugging-Modus Bugs auftauchen, die im Debug-Modus nicht vorhanden sind. –

+0

Der Release-Build erlaubt XCode nicht, sich mit der App zu verbinden - zumindest in meinem Fall. Ist das anders für dich? – fishinear

Antwort

16

Sie können überprüfen, ob ein Debugger (wahrscheinlich, aber nicht definitiv, Xcode) mit sysctl angeschlossen ist. Hier ist, wie 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

Perfekt. Vielen Dank! –

+0

Beachten Sie, dass Sie # für getpid() – Ryan

+0

@Ryan einschließen müssen Nur wenn Sie Foundation nicht enthalten, die Sie wahrscheinlich sind, wenn Sie GCD verwenden, Objektsyntax, BOOL einschließlich YES und NO. Aber ich werde die Abhängigkeit von Foundation notieren. :) –

Verwandte Themen