正如问题所述,我主要想知道我的代码是否在模拟器中运行,但也有兴趣了解正在运行或正在模拟的特定iphone版本.
编辑:我在问题名称中添加了"以编程方式"这个词.我的问题是能够动态地包含/排除代码,具体取决于正在运行的版本/模拟器,所以我真的在寻找类似于预处理器指令的东西,它可以为我提供这些信息.
我试图根据代码是通过USB/Xcode(调试)运行,还是从app store(发布版)下载的生产模式启用/禁用部分代码.我知道检查它是否正在运行DEBUG
或RELEASE
模式如下:
#ifdef DEBUG
// Stuff for debug mode
#else
// Stuff for release mode
#endif
Run Code Online (Sandbox Code Playgroud)
但问题是,我看到一个明显的循环漏洞,你可以将'Run'构建方案的Build Configuration从'Debug'更改为'Release'.更好的方法是,如果我可以简单地检测它是否从Xcode运行.我还没有办法检查这个.
有没有办法检查iOS应用程序是否从Xcode运行?
我正在尝试实现自定义资产宏(类似于assert.h所具有的),但我希望能够在获得并断言之后继续执行.
例如,一个这样的ASSERT
实现可以是:
#define ASSERT(expr) ((void)( (!!(expr)) || (__debugbreak(), 0)))
Run Code Online (Sandbox Code Playgroud)
__debugbreak是Microsoft编译器中的一个内部函数,它插入了软件断点,相当于_asm int 3
x86.对于iOS,有不同的方法来实现__debugbreak:
__asm__("int $3");
对于x86.__asm__("bkpt #0");
对于常规手臂.__asm__("brk #0");
for arm64raise(SIGTRAP)
但是当我的断言命中时,所有这些都不能简单地跨过并继续我在使用visual studio时可以做的事情; 当我的iOS构建中的某些东西断言它在断言时卡住了,我别无选择,只能终止,我甚至无法手动移动指令指针并跳过断言.
是否有可能在iOS上实现断言进入调试器并仍允许我继续执行的断言?
我正在构建一个将敏感数据传输到我的服务器的iOS应用程序,我正在签署我的API请求作为额外措施.我想尽可能地进行逆向工程,并且使用Cycript查找某些真实应用程序的签名密钥,我知道通过附加到流程来找到这些密钥并不困难.我完全清楚,如果有人真的很熟练并且努力尝试,他们最终会利用,但我想尽可能地努力,同时仍然方便自己和用户.
我可以检查越狱状态并采取其他措施,或者我可以执行SSL固定,但通过附加到进程并修改内存,两者仍然很容易绕过.
有没有办法检测是否有某些东西(无论是Cycript,gdb,还是任何可用于破解流程的类似工具)附加到流程中,而不是被App Store拒绝?
编辑:这不是检测iOS应用程序是否在调试器中运行的重复.该问题与输出更相关,它检查输出流以确定是否有输出流附加到记录器,而我的问题与此无关(并且该检查不包括我的条件).
如何检测我的应用程序是在编译后从 xcode 启动还是从 itunes 下载的软件包启动?
下面的代码似乎不起作用,因为当我从 xcode 构建并运行它时,else 块总是被执行。
#if (TARGET_OS_SIMULATOR)
#else
//Xcode did not launch this app
#endif
Run Code Online (Sandbox Code Playgroud)