Обнаруживать, запускается ли приложение Swift из Xcode

Я хотел бы программно определить, запускается ли приложение iOS непосредственно из XCode (либо в симуляторе, либо на привязанном устройстве). Я пробовал решение -D DEBUG, описанное здесь , но когда я отсоединяюсь от Xcode и снова запускаю приложение, он все еще думает, что он находится в режиме отладки. Я думаю, что я ищу версию Swift этой функции

#include <assert.h> #include <stdbool.h> #include <sys/types.h> #include <unistd.h> #include <sys/sysctl.h> static bool AmIBeingDebugged(void) // Returns true if the current process is being debugged (either // running under the debugger or has a debugger attached post facto). { int junk; int mib[4]; struct kinfo_proc info; size_t size; // Initialize the flags so that, if sysctl fails for some bizarre // reason, we get a predictable result. info.kp_proc.p_flag = 0; // Initialize mib, which tells sysctl the info we want, in this case // we're looking for information about a specific process ID. mib[0] = CTL_KERN; mib[1] = KERN_PROC; mib[2] = KERN_PROC_PID; mib[3] = getpid(); // Call sysctl. size = sizeof(info); junk = sysctl(mib, sizeof(mib) / sizeof(*mib), &info, &size, NULL, 0); assert(junk == 0); // We're being debugged if the P_TRACED flag is set. return ( (info.kp_proc.p_flag & P_TRACED) != 0 ); } 

Вы можете просто сохранить функцию C и вызвать ее из Swift. Рецепты, приведенные в разделе Как вызвать код Objective-C из Swift, также применяются к чистым C-кодам.

Но на самом деле не слишком сложно перевести этот код в Swift:

 func amIBeingDebugged() -> Bool { var info = kinfo_proc() var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] var size = strideofValue(info) let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0) assert(junk == 0, "sysctl failed") return (info.kp_proc.p_flag & P_TRACED) != 0 } 

Примечания:

  • kinfo_proc() создает полностью инициализированную структуру со всеми полями, установленными в ноль, поэтому установка info.kp_proc.p_flag = 0 не требуется.
  • Тип C intInt32 – Swift.
  • sizeof(info) из кода C должен быть strideOfValue(info) в Swift, чтобы включить дополнение структуры. С sizeofValue(info) вышеуказанный код всегда возвращал false в Simulator для 64-разрядных устройств. Это была самая сложная часть для выяснения.

Обновление для Swift 3 (Xcode 8):

strideofValue и связанные функции уже не существуют, они были заменены MemoryLayout :

 func amIBeingDebugged() -> Bool { var info = kinfo_proc() var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()] var size = MemoryLayout<kinfo_proc>.stride let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0) assert(junk == 0, "sysctl failed") return (info.kp_proc.p_flag & P_TRACED) != 0 } 
  • Пример Swift MVVM с бизнес-слоями и данными
  • Параметр PFAnalytics не отслеживает нажатие
  • Переименовать файл в DocumentDirectory
  • Swift UIDevice.currentDevice () не компилируется
  • CloudKit получает множественное уведомление о создании записи
  • Внедрение шифрования HMAC и SHA1 в быстром режиме
  • Как я могу аннулировать / деактивировать NSTimer, не делая этого в viewWillDisappear?
  • Как получить битрейт MP3 в SWIFT
  • Как я могу привести к сбою в приложении Swift iOS с помощью SDK Fabric?
  • UIGestureRecognizer с закрытием
  • Условно импортировать фреймворк (например, речь) на основе версии iOS в Swift?
  • Interesting Posts

    Моя кнопка не обнаруживает события касания на iPhone (Retina 4-inch) симулятор, но работает в iPhone (Retina 3,5-дюймовый) симулятор

    Кнопка «Назад» не соответствует цвету (цель c)

    Запрос выборки основной базы данных завершился неудачей: «NSInternalInconsistencyException», причина: оператор все еще активен,

    Как создать прозрачный оверлей по всему экрану, включая активную клавиатуру

    Функция временной метки, которая работает надежно, просто вызвала EXC_BAD_INSTRUCTION

    Изменение имени устройства CoreBluetooth

    AudioStream от Matt Gallagher: как обращаться с контроллером просмотра pop

    Использование singleton для создания базового класса вспомогательного класса

    Сеанс AVCapture для захвата изображения SWIFT

    keyboardWillShow вызывается для клавиатуры другого приложения

    Кордова iOS: xcrun не может найти «PackageApplication» после обновления xcode

    Ошибка проверки архива

    Запуск огурца для iOS в работе jenkins не выполняется с помощью Errno :: ECONNREFUSED: (Соединение отклонено – подключиться (2) (http: // localhost: 37265))

    Не найдено подходящих записей приложений

    Добавление аннотации к PDF-файлу

    Давайте будем гением компьютера.