3

これは難しい問題です。私は機内モードを 1 日に何十回も切り替えますが、それをすばやく行う方法が必要です。私は、機内モード専用の物理ボタンのために殺すようなまれなユーザーです. 音量を下げるボタンで試してみたいと思います。これはアプリ ストアにはありませんが、いくつかのプライベート ライブラリを使用できることを嬉しく思います (実際、必要になると思います)。実際、電話をジェイルブレイクする必要があることが判明するかもしれません。この段階では、特定のコードではなく、一般的なアーキテクチャのアドバイスを探しています (ただし、決して害はありません)。

問題は、この問題に取り組むのに最適なアーキテクチャは何かということです。私はこのように問題を分解します:

1) アプリをバックグラウンドで実行し続けて、音量ボタンの押下 (およびおそらくリモコン デバイスからの音量ダウン イベント) をリッスンして応答できるようにする方法。ここでは 3 つの選択肢があります。 --VOIP アプリを作成する --ナビゲーション アプリを作成する --音声アプリを作成する 音声アプリが最も合理的な方法のようです。アプリをバックグラウンドで動作させ続けるために、サイレント トラックを繰り返し再生し続ける必要がありますか? 別のアプリからオーディオ トラックを再生すると、アプリが停止するという問題が発生するようです。

2) 音量ダウン イベントを傍受する方法。この問題に対する 1 つの答え: iPhone の音量ボタンへのプログラム アクセス

3) 飛行機のステータスを確認し、変更する方法。私が理解していないいくつかのMachコードと動的リンクに関するこの問題に対する古い回答: http://blogs.oreilly.com/iphone/2009/01/bring-airplane-mode-control-ba.html

プライベート ライブラリを理解するための最良のリソースは、http: //theiphonewiki.com/wiki/index.php?title= /System/Library/Frameworks にあります。

より良いプライベート ライブラリ「ドキュメント」の提案や、Zdziarski による「iPhone Open Application Development」ブックの更新を歓迎します。

一緒に考えてくれてありがとう!

4

1 に答える 1

2

それらはすべて無関係なので、複数の個別の質問に分割する方がよいと思います。

1)バックグラウンドについて。LocationManager を使用し、定期的にオンとオフを切り替えることをお勧めします。これにより、バックグラウンドに留まることができる時間をカウントしているタイマーがリセットされます。

ここにいくつかの便利なリンクがあります:

iPhone - イベントをポーリングするためのバックグラウンド処理

setKeepAliveTimeout と BackgroundTasks

http://www.slideshare.net/tranq72/ios4-multitasking-development-notes

2)わかりません。

3) SBSetAirplaneModeEnabled API が削除されたため、この方法は機能しなくなりました。

ただし、提供されたリンクのコードがどのように機能するかを説明できます。

#define SBSERVPATH  "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"

これらは、さまざまな動的にロードされたライブラリの保存場所を定義するだけです。

void *sbserv = dlopen(SBSERVPATH, RTLD_LAZY);

これにより、動的にロードされたライブラリがロードされます

int (*setAPMode)(mach_port_t* port, BOOL yorn) = 
         dlsym(sbserv, "SBSetAirplaneModeEnabled");

このコードは 2 つのことを行います。dlsym は、この動的にロードされたライブラリで SBSetAirplaneModeEnabled 関数を見つけてアドレスを指定します。そしてそれを setAPMode 変数に格納します。

setAPMode(p, yorn);

これは、この関数を呼び出すだけです。

dlclose(sbserv);

これにより、ハンドルが閉じられます (もう必要ありません)。

mach_port_t多くのプライベート API 呼び出しの一部として多くのことがわかります。通常、このマッハ ポートはプロセス間通信システムの一部です。

ここに非常に簡単な説明があります。他のアプリケーションと通信するには、それにメッセージを送信する必要があり、mach_port_tこれらのメッセージを送信するためのハンドルです。例として、setAPMode機内モードのオン/オフを切り替える SpringBoard アプリケーションに内部的にメッセージを送信します。これが、これらの関数に渡す必要がある理由です。

他のアプリケーションのポートを取得するには、さまざまな方法があります。ただし、プライベート API の最も一般的な方法は、ポートを返す別のプライベート API を呼び出すことです。

Springboard サーバー ポートを返し、SBSSpringBoardServerPort他の Sprinboard クライアント側 API に渡す API があります。

于 2012-09-20T20:02:21.803 に答える