3

这是一个很难的。我每天要切换飞行模式十几次,并且想要一种快速的方法来做到这一点。我是少数会为专用于飞行模式的物理按钮而死的用户。我想尝试使用降低音量按钮来完成。这不会出现在应用商店中,我很高兴(而且我认为确实有必要)使用一些私人图书馆。事实上,事实证明我需要越狱手机。在这个阶段我正在寻找一般的架构建议,而不是特定的代码(尽管这永远不会受到伤害)。

所以问题是:解决这个问题的最佳架构是什么?我以这种方式分解问题:

1)如何让应用程序在后台运行,以便它可以监听并响应音量按钮按下(可能还有来自远程控制设备的音量降低事件)。我在这里有三个选择: --创建一个VOIP应用程序--创建一个导航应用程序--创建一个音频应用程序音频应用程序似乎是最合理的方式。我是否必须不断重复播放无声曲目以使我的应用程序在后台保持活力?如果我从另一个应用程序播放音轨,我似乎会遇到应用程序死机的问题。

2)如何拦截音量下降事件。这个问题的一个答案: 程序访问 iPhone 音量按钮

3)如何检查飞机状态并进行更改。这个问题的旧答案是我不明白的一些马赫代码和动态链接: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 开放应用程序开发”一书的更新都将受到欢迎。

感谢您和我一起考虑这个问题!

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");

这段代码做了两件事。dlsym 在这个动态加载的库中找到 SBSetAirplaneModeEnabled 函数的地址。并将其存储在 setAPMode 变量中。

setAPMode(p, yorn);

这只会调用这个函数。

dlclose(sbserv);

这将关闭句柄(我们不再需要它)。

您会看到mach_port_t很多私有 API 调用的一部分。通常这个马赫端口是进程间通信系统的一部分

这是非常简短的解释。为了与其他应用程序通信,您需要向它发送消息,并且mach_port_t是您发送这些消息的句柄。例如,在setAPMode内部向 SpringBoard 应用程序发送一条消息,该应用程序打开/关闭飞行模式。这就是为什么我们必须将它传递给这些函数的原因。

有不同的方法可以获取其他应用程序的端口。但是,私有 API 最常见的是调用另一个私有 API,它将端口返回给您。

有一个 API,SBSSpringBoardServerPort它返回 Springboard 服务器端口并将其传递给其他 Sprinboard 客户端 API。

于 2012-09-20T20:02:21.803 回答