2017-03-16 4 views
0

私はSwift-Keyloggerをコマンドラインプログラムとして使用してきました。ココアでバックグラウンドでコードを継続的に実行

私は最近、Macの開発を開始したので、UIを作成することを考えました。

コマンドラインプログラムであるため、作者はRunLoop.current.run()を使用してキーロガーを連続して実行しています。

今、UIをブロックするので、私はRunLoop.current.run()を使用できません。

私はGCDを調べましたが、それはコードを実行するだけです。しかし、私はそれを継続的に実行したい。私は継続的な実行に関するいくつかの追加の記事を見たが、Timerを使用して指定した時間ごとにコードを実行し続けていることがわかった。

したがって、UIをブロックせずに同じ動作をするRunLoop.current.run()をどのように置き換えることができますか?

答えて

1

UPDATE:18/01/2018

いくつかの男があなたと同じ要件を私に近づきました。いくつかの議論と試行錯誤の後、彼は解決策を見つけました。

1)キーロガーコードのRunLoop.main.run()行をコメントアウトしてください。

2)アプリサンドボックスを無効にします。アプリケーションサンドボックスを有効にする場合は、このエンタイトルメントをcom.apple.security.device.usb = YESに追加します。


オリジナル:18/03/2017

私はキーロガーを書いているとき、私はまた、最初にそれのために多くのことを検索。 1日後、私はあきらめた。

私はすぐにProcessを使用して、自分のUIからキーロガーを実行します。

私が行う方法は、次のとおりです。

は、ファイル/フォルダのパスのようなキーロガーのソースに必要な変更を行います。

キーロガーのソースをコンパイルします。

キーロガーをXcodeのプロジェクトにドラッグし、copy if neededにチェックを入れます。

実行ファイルは、.app内のリソースフォルダにあります。

Processクラスとlaunch()を使用して実行可能ファイルを実行すると、実行可能ファイル/キーロガーが起動します。

作成したプロセスを終了する必要があります。そうしないと、キーロガーがバックグラウンドで実行されます。キーロガーを停止するには、Process変数にterminate()を使用します。

コード:

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() 

編集:18/03/2017

にアプリを終了してください通常は、Xcodeの停止ボタンを押すのではなく、メニューバーで終了するか、ドックで終了するかのいずれかです。私はあなたがXcodeで停止を押していると思います。

+0

もう一度お会いしましょう!私はコードを試してみる。 – ssh

+0

私は小さな問題があります。 'keylogger.terminate()'を 'applicationWillTerminate(_ aNotification:Notification)'に配置しましたが、決して呼び出されません。私はプリントステートメントを置くことでチェックして、ターミナルをチェックインしたときにキーロガーはまだバックグラウンドにあります。 – ssh

+0

それは動作します!再度、感謝します。 – ssh

関連する問題