检测 Swift 应用程序是否正在从 Xcode 运行

2023-12-27

我想以编程方式确定 iOS 应用程序是否直接从 XCode 运行(在模拟器中或在连接设备上)。 我已经尝试过所述的 -D DEBUG 解决方案here https://stackoverflow.com/a/30013587/630657,但是当我断开与 Xcode 的连接并重新运行该应用程序时,它仍然认为它处于调试模式。 我想我正在寻找的是 Swift 版本这个功能 https://developer.apple.com/library/ios/qa/qa1361/_index.html

#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 版本)检查是否 该程序运行在调试器控制,如果它正在运行,则不会 Xcode。可以在 Xcode 之外调试程序(通过调用 lldb 或 直接 gdb),并且可以从 Xcode 运行程序而无需调试它 (如果方案设置中的“调试可执行文件”复选框处于关闭状态)。


您可以简单地保留 C 函数并从 Swift 调用它。 中给出的食谱如何从 Swift 调用 Objective-C 代码? https://stackoverflow.com/questions/24002369/how-to-call-objective-c-code-from-swift也适用于纯 C 代码。

但将该代码转换为 Swift 实际上并不太复杂:

func amIBeingDebugged() -> Bool {
    // Buffer for "sysctl(...)" call's result.
    var info = kinfo_proc()
    // Counts buffer's size in bytes (like C/C++'s `sizeof`).
    var size = MemoryLayout.stride(ofValue: info)
    // Tells we want info about own process.
    var mib : [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()]
    // Call the API (and assert success).
    let junk = sysctl(&mib, UInt32(mib.count), &info, &size, nil, 0)
    assert(junk == 0, "sysctl failed")
    // Finally, checks if debugger's flag is present yet.
    return (info.kp_proc.p_flag & P_TRACED) != 0
}

Swift 5 更新 (Xcode 10.7): strideofValue并且相关的功能已经不存在了, 他们已被取代MemoryLayout.stride(ofValue:).

Remarks:

  • kinfo_proc()创建一个完全初始化的结构,其中包含所有内容 字段设置为零,因此设置info.kp_proc.p_flag = 0没有必要。
  • The C int类型是Int32是斯威夫特。
  • sizeof(info)从C代码必须是strideOfValue(info)在 Swift 中包含结构填充。和sizeofValue(info)对于 64 位设备,上述代码在模拟器中始终返回 false。这是最难弄清楚的部分。

斯威夫特2逻辑:

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
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检测 Swift 应用程序是否正在从 Xcode 运行 的相关文章

  • Swift 3:绘制矩形

    我刚接触 swift 三天 我正在尝试弄清楚如何绘制矩形 我对这门语言太陌生 不知道要扩展的类和要重写的方法 并且我四处寻找示例代码 但似乎没有任何效果 我将其归因于我对 swift 3 的使用 我现在正在尝试的是 import UIKit
  • 使用随机初始密钥解码字典

    我正在接收并尝试解析包含事件数据的 json 文件 它是一个字典的字典 其组织方式如下 其中每个事件的键都是随机事件 id 19374176 122 event title Cool Fun Thing to Do description
  • Xcode 9.2 UIDocumentBrowserViewController:无法从 bookmarkableString 创建 url

    Update Xcode 9 3 已修复它 在创建 UIDocument 文件时UIDocumentBrowserViewController 默认 错误 无法解析书签 错误 错误域 NSFileProviderInternalErrorD
  • 将数据追加到 UITableView 的正确方法,swift

    我正在尝试使用两种方式将新数据添加到 UITableView 第一种方式 func insertData appendMessages Message var currentCount self messeges count var ind
  • 我可以/如何确定设备是否有振动?

    我有一些设置可以启用 禁用某些操作的振动 但我发现如果设备没有振动能力 则显示它们毫无意义 有没有办法检查用户是否正在使用 iPod touch 以及它是否有振动 我不确定除了进行模型检查之外还有其他方法可以做到这一点 这可能不是一个很好的
  • 在 Swift 中,如何检测哪些 UIControl 事件触发了操作?

    我目前有 4 个 UITextField IBOutlet weak var fNameTextField UITextField IBOutlet weak var lNameTextField UITextField IBOutlet
  • reloadData 调用 numberOfSections、numberOfRows,而不是 cellForRowAtIndexPath

    首先 如果格式不正确 我很抱歉 这是第一次这样做 我已经使用 stackoverflow 来寻求帮助很长时间了 它非常有帮助 谢谢大家 但这是我第一次发布自己的问题 这个问题已经被问过很多次了 但是当我调用 myTable reloadTa
  • 如何在 Objective C 中创建 json 字符串?

    我必须动态生成一个 json 字符串并需要发送到服务器 有谁知道如何使用NSJSONSerialization 下面是我的字符串 surveyid Survey1 responsetime dd mm yyyy hh mm ss locat
  • 以编程方式设置 UITextField 占位符颜色

    如何在 swift 中以编程方式设置 UITextField 占位符颜色 1 创建一个具有所需颜色的 AttributedString 2 将此 AttributedString 设置为文本字段 attributePlaceholder 属
  • Health 处理多个步骤源的方式与 HealthKit 不同——swift

    我的 Swift iOS 应用程序与 HealthKit 连接 向用户显示他们当天到目前为止已经走了多少步 在大多数情况下 这是成功的 当步数的唯一来源是 iPhone 内置计步器功能记录的步数时 一切正常 并且我的应用程序显示的步数与健康
  • 跨平台 IAP

    我已在 iOS 和 Android 中集成了应用内购买 自动续订订阅 两者都工作正常 我对使用跨平台验证 IAP 有一定的疑问 例如 当多个用户登录一个应用程序时 某一特定应用程序的订阅如何运作 例如 如果用户 A 有标准套餐并且从应用程序
  • DFP 问题:无广告可展示

    我的应用程序在 UIScrollView 中提供三个广告 通过 DoubleClick for Publisher 我使用旧版本的适用于 iOS 的 AdMob SDK 一切正常 我决定下载新版本 因为 AppStore 出现一些问题 添加
  • 动态获取协议的字符串表示形式

    我正在寻找一种从协议类型动态获取协议名称的方法 而不必使用 objc协议声明中的属性 我知道这有效 func keyForProtocol aProtocol Protocol gt String return NSStringFromPr
  • iOS - 当应用程序被终止时处理静默推送通知

    我目前在 iOS 中遇到推送通知问题 我的应用程序收到包含标识符的静默推送通知 然后 该标识符用于从创建本地通知的远程服务器获取数据 据我所知 如果用户强制退出应用程序 即通过双击主页按钮并滑动关闭应用程序 则静默推送通知不会传递到 App
  • 如何从 UITableViewController 中的静态单元格获取文本字段?迅速

    我的视图层次结构如下所示 UIViewController 类型的 ElevethViewController容器视图嵌入容器视图中的 UITableViewController 类型的 ManagedTableEleventhViewCo
  • 使 UITableView 中的动态更新内容可供 VoiceOver 访问

    我正在努力让我的应用程序更易于访问 到目前为止 标签和提示等标准可访问性正在创造奇迹 然而 我在动态更新 UITableView 中显示的内容时遇到了问题 表的每一行大约每秒更新一次 但如果我尝试在此时创建每个单元格的accessibili
  • 将 GestureRecogniser 附加到多个图像视图

    今天我在将相同的手势识别器附加到多个图像视图时遇到了一些奇怪的事情 它仅附加到最后一个视图 换句话说 它只能附加到一个视图 我必须创建多个手势识别器才能满足我的要求 以下是我所做的 我做的对吗 这是将识别器附加到多个图像视图的唯一方法吗 请
  • Swift 2.1- tabBarController!.selectedIndex 返回大整数

    我需要把tabBarController selectedIndex常量内的数字 我期望一个介于 0 和 3 之间的数字 具体取决于我选择的选项卡 但我得到的数字如下2147483647 有什么想法吗 代码是 let selectedTab
  • Swift:在后台同步执行代码; queue.sync 没有按我的预期工作

    我想在后台同步执行一些代码 我真的认为这是正确的方法 let queue DispatchQueue global qos default queue async print Thread isMainThread 但这打印true除非我用
  • 如何使 SwiftUI 列表行背景颜色扩展整个宽度,包括安全区域之外

    在 SwiftUI 中List 如何制作列表行背景 通过设置 listRowBackground 扩展视图的整个宽度 甚至在安全区域下方 例如 在宽屏 iPhone 例如 iPhone 12 Pro Max 上横向运行时 目前 该单元格在安

随机推荐

  • Telerik Sitefinity 密码哈希函数

    我有一个表 其中包含 Telerik Sitefinity 系统的登录凭据 我想使用相同的登录凭据 但使用不具有 Sitefinity 库的不同应用程序 我正在努力解决密码编码问题 该编码设置为哈希 默认为 SHA1 算法 我尝试使用以下代
  • Django - URL 中的短非线性不可预测 ID

    我知道还有类似的问题 比如this https stackoverflow com questions 3295405 creating django objects with a random primary key this https
  • 32 位/x86 系统上的 ${env:ProgramFiles(x86)} Powershell 变量包含什么?

    简单的问题 如果我在 32 位系统上的 PowerShell 脚本中使用 env ProgramFiles x86 变量 它会返回 C Program Files 还是未定义 在 x64 系统上 当以 x64 和 x86 模式运行时 它将映
  • Angular 2 的 JQuery .param() 方法?

    有没有这样的事情 param http api jquery com jquery param Angular2 的 JQuery 函数 我知道 Angular 1 特别有类似的服务 Angular1 等效项 https docs angu
  • 输出非空终止的字符数组行为?

    char sentence k k k k k k k k 8 character std cout lt lt sentence lt lt std endl 然后输出就是kkkkkkkk 但是如果我们递减数组的字符 即前面的数组在少于
  • 用于生成锁定文件的 CocoaPods 版本 (1.5.3) 高于当前可执行文件的版本 (1.5.2)

    on pod install它发出警告并失败 用于生成锁定文件的 CocoaPods 版本 1 5 3 高于当前可执行文件的版本 1 5 2 https github com pawarvijay pod install error blo
  • 为什么 C++ 中需要析构函数?

    当指针超出范围时 它的内存被释放 那么为什么destructor是用c 创建的吗 如果您问为什么 C 类有析构函数 有些类除了释放内存之外还有其他要求 例如 您可能有一个分配了套接字连接的对象 需要彻底关闭该连接 另外 取消范围 指针确实n
  • 在Java中,是否有更优雅的方法来从字符串的ArrayList中删除重复的字符串?

    所以 长话短说 我有一个 Java 家庭作业 需要以各种方式操作一个很长的字符串 ArrayList 我们正在做一些事情 比如显示单词组合 在 ArrayList 中添加和删除 没什么特别的 我注意到提供的一些 ArrayList 具有重复
  • ActionScript - 确定值是否为类常量

    如果某个特定函数在没有传递值的情况下无法工作 并且该值恰好是包含该函数的类的公共常量 我想抛出参数错误 无论如何 有没有办法确定一个类是否拥有一个公共常量 而不必遍历所有常量 像这样的东西 public static const HALIF
  • 如何从 EXC_BAD_ACCESS 中恢复?

    我是故意造成的EXC BAD ACCESS 通过触发写入NSObject在只读虚拟内存页中 理想情况下 我想抓住EXC BAD ACCESS 将虚拟内存页标记为可读写 并像平常一样继续执行 这可能吗 我编写的代码导致EXC BAD ACCE
  • 布局中定义的 Android EditText onClick Listener 失败并出现模糊异常

    我想在可能的活动的 Layout XML 中为 EditText 定义一个 onClick 侦听器 但它总是失败并出现一个模糊的异常 布局中注入了setContentView in the onCreate 我的活动方法 我是not在这里使
  • 如何从TinyDB中删除记录或文档

    如何从TinyDB中删除记录或文档 数据库示例 1 id key xxx params 2 id key yyy params 我想删除 1 if id key xxx 在 TinyDB 教程中建议使用以下代码 如何完成删除记录 文档 db
  • 应用内购买可以防止软件盗版吗

    我意识到如果开发者在 Google Android Market 中发布付费应用程序 很快 付费应用程序将通过其他 Android Market 免费分发 当谈到中国市场时 盗版问题尤其严重 例如 我的水在哪里 中文 http www wa
  • 当指定 return 时,location 块中的 auth_basic 不起作用?

    我认为这会起作用 但由于某种原因它会跳过 auth basic 并始终返回 200 如果我将 200 替换为 301 重定向 也会发生同样的情况 如果我注释掉返回语句 它就可以正常工作 理想情况下我想要一个 auth一旦通过身份验证 端点就
  • C 中带有 pthread 的线程中的计时器?

    在线程中 我需要定期以不同的时间间隔做一些工作 什么是一个好的方法来做到这一点 使用 sleep 然后我需要跟踪下一次唤醒的间隔 这似乎不是最好的方法 thanks 您可以使用clock nanosleep与TIMER ABSTIME标记为
  • 如何从密钥库导出 .key 和 .crt

    当我在开发机器上构建 Android 应用程序时 我需要为应用程序提供 SSL 证书 因此我使用 Tomcat 的 keytool 生成了一个密钥库 我从密钥库中提取了证书并将其放入 bks 中以使用 android 一切顺利 现在我们必须
  • Chrome 中高度 100%

    我的一侧有问题divChrome 中的高度不会达到 100 在FF中效果很好 我在用着 html body padding 0px width 100 height 100 div min height 100 这是为什么 这对我来说在每个
  • 确认回发 OnClientClick 按钮 ASP.NET

  • 使用 Graph FQL 获取朋友当前位置的纬度/经度

    我正在尝试使用单个 API 调用来获取用户所有朋友的纬度 经度 我相信我需要编写一个多查询 FQL 语句 但我无法获得正确的语法 我相信这两个查询需要类似于以下内容 friends SELECT uid current location F
  • 检测 Swift 应用程序是否正在从 Xcode 运行

    我想以编程方式确定 iOS 应用程序是否直接从 XCode 运行 在模拟器中或在连接设备上 我已经尝试过所述的 D DEBUG 解决方案here https stackoverflow com a 30013587 630657 但是当我断