在cocoa的后台连续运行代码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在cocoa的后台连续运行代码相关的知识,希望对你有一定的参考价值。

我一直在使用Swift-Keylogger作为命令行程序。

我最近开始使用mac开发时想到了它的UI。

由于它是一个命令行程序,作者使用RunLoop.current.run()按顺序连续运行键盘记录程序。

现在问题是我不能使用RunLoop.current.run()因为它阻止了UI。

我查看了GCD,它只运行一段代码。但我想继续运行它。我看到了一些关于连续运行的其他文章,但我发现在每个'n'指定时间后使用Timer连续运行代码。

那么,如何在不阻止UI的情况下替换具有相同行为的RunLoop.current.run()

答案

更新:05/07/2018

要从UI启动和停止键盘记录器,请从GitHub检查此问题


更新:18/01/2018

有些人和我一样接近我。经过一番讨论和试错法,他找到了解决方案。

1)只需在键盘记录代码中注释掉RunLoop.main.run()行。

2)现在禁用应用程序沙箱。如果要启用应用程序沙箱,请添加此权利com.apple.security.device.usb = YES


原文:2017/03/17

我在编写键盘记录器的时候也开始搜索它。过了一天,我放弃了。

我在swift中使用Process从我的UI运行键盘记录器。

我的方式是:

在键盘记录程序源中进行必要的修改,例如文件/文件夹的路径。

编译键盘记录程序源。

将键盘记录器拖到Xcode中的项目中,然后检查copy if needed

可执行文件位于.app内的resources文件夹中。

使用Process类和launch()运行可执行文件以启动可执行文件/您的键盘记录程序。

您应该终止创建的进程,否则键盘记录器将在后台运行。要停止键盘记录器,请在terminate()变量上使用Process

码:

let pathToKeylogger = Bundle.main.resourcePath! + "/Keylogger" // path to keylogger executable
keylogger = Process() // You need to declare this variable at class-level because you need to have the variable later to terminate it.
keylogger.launchPath = pathToKeylogger
keylogger.launch()

终止:

keylogger.terminate()

编辑:2017/03/17

尝试通常退出您的应用程序,即单击退出菜单栏或在Dock中,而不是按Xcode中的停止按钮。我想你在Xcode中停止了。

以上是关于在cocoa的后台连续运行代码的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用程序运行时连续检查互联网连接

替换或删除后台堆栈上现有片段的代码不起作用

如何在没有额外自定义代码的情况下强制使正在运行的 Cocoa 程序失效?

当 FragmentActivity 在 Android 中进入后台时出现 NotSerializableException

如何在iOS 8中应用程序处于后台状态时连续执行任务

Xcode自定义代码块