这个问题在这里已经有一个答案:>
Detecting if iOS app is run in debugger4个
我试图根据代码是否通过USB / Xcode(调试)运行,或者从应用商店(发行版)下载的生产模式中启用/禁用部分代码.我知道检查它是否在DEBUG或RELEASE模式下运行,如下所示:
我试图根据代码是否通过USB / Xcode(调试)运行,或者从应用商店(发行版)下载的生产模式中启用/禁用部分代码.我知道检查它是否在DEBUG或RELEASE模式下运行,如下所示:
#ifdef DEBUG // Stuff for debug mode #else // Stuff for release mode #endif
但问题是,我看到一个明显的循环孔,您可以将“运行”构建方案的构建配置从“Debug”更改为“Release”.一个更好的方法是,如果我可以简单地检测它是否从Xcode运行.我没有找到一个方法来检查这个.
有没有办法检查iOS应用程序是否从Xcode运行?
解决方法
您可以使用sysctl检查调试器是否附加(可能是但不是绝对的Xcode).以下是
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; }