Подтвердить что ты не робот

IOS - определить, запущено ли приложение из Xcode

Я пытаюсь включить/отключить части моего кода на основе того, выполняется ли код через USB/Xcode (debug) или в режиме производства, загруженном из магазина приложений (выпуск). Я знаю, что он работает в режиме DEBUG или RELEASE, например:

enter image description here

#ifdef DEBUG

// Stuff for debug mode

#else

// Stuff for release mode

#endif

но проблема в том, что я вижу явное отверстие в петле, вы можете изменить конфигурацию сборки для схемы сборки "Выполнить" с "Отладка" до "Отпустить". Лучше всего было бы, если бы я мог просто определить, работает ли он с Xcode или нет. Я не нашел способ проверить это.

Есть ли способ проверить, запущено ли приложение iOS из Xcode или нет?

4b9b3361

Ответ 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;
}