我试图根据代码是否通过 USB/Xcode(调试)运行或在从应用程序商店下载的生产模式(发布)运行来启用/禁用部分代码。我知道检查它是否正在运行DEBUG
or RELEASE
像这样的模式:
#ifdef DEBUG
// Stuff for debug mode
#else
// Stuff for release mode
#endif
但问题是,我看到的一个明显的漏洞是您可以将“运行”构建方案的构建配置从“调试”更改为“发布”。更好的方法是我可以简单地检测它是否从 Xcode 运行。我还没有找到方法来检查这一点。
有没有办法检查 iOS 应用程序是否正在从 Xcode 运行?
您可以使用以下命令检查是否附加了调试器(可能但不是绝对,Xcode)sysctl
。就是这样HockeyApp 做到了 https://github.com/bitstadium/HockeySDK-iOS/blob/1f6cc3f84a0b28157c6445d6657799d064d3720a/Classes/BITCrashManager.m#L638:
#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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)