iOS - определить, запущено ли приложение из Xcode
Я пытаюсь включить / отключить части моего кода в зависимости от того, выполняется ли код через USB/Xcode (отладка) или в производственном режиме, загруженном из магазина приложений (выпуск). Я в курсе проверки, работает ли он в DEBUG
или же RELEASE
режим как это:
#ifdef DEBUG
// Stuff for debug mode
#else
// Stuff for release mode
#endif
но проблема в том, что я вижу очевидную дыру в том, что вы можете изменить конфигурацию сборки для схемы сборки "Выполнить" с "Отладка" на "Выпуск". Лучше было бы, если бы я мог просто определить, работает ли он из Xcode или нет. Я не нашел способ проверить это.
Есть ли способ проверить, запущено ли приложение iOS из Xcode или нет?
1 ответ
Решение
Вы можете проверить, подключен ли отладчик (возможно, но не обязательно Xcode), используя sysctl
, Вот как это делает HockeyApp:
#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;
}