使用音量按钮在iPhone上切换飞行模式

3
这是一个棘手的问题。我每天要切换几十次飞行模式,希望有一种快速的方式来完成。我是那种为了飞行模式而渴望拥有一个物理按钮的稀有用户。我想尝试使用下音量按钮来实现。这不会在应用商店上出现,我很高兴(事实上,我认为这是必要的),可以使用一些私有库。事实上,可能需要越狱手机。我现在正在寻求一般性的架构建议,而不是具体的代码(虽然这从来没有伤害过)。
所以问题是:如何最好地处理这个问题的架构?我将问题分解如下:
1)如何使应用程序在后台运行,以便可以监听并响应音量按钮按下事件(以及来自遥控设备的下音量事件)。我有三个选择: - 创建VOIP应用程序 - 创建导航应用程序 - 创建音频应用程序 音频应用程序似乎是最合理的方法。我是否需要不断重复播放静音曲目以使我的应用程序保持活动状态?如果我从另一个应用程序播放音轨,似乎我会遇到应用程序死亡的问题。

2) 如何拦截音量减小事件。对于这个问题的一个解答是: 访问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开放应用程序开发”书籍的建议。

感谢您与我一起思考这个问题!


这里是如何切换飞行模式的方法。 - Nate
1个回答

2

我认为最好将问题分解成多个单独的问题,因为它们都是不相关的。

1) 关于后台运行。我建议使用LocationManager并定期打开和关闭它。这将重置计时器,计算您可以在后台停留的时间。

以下是一些有用的链接:

iPhone-后台轮询事件

setKeepAliveTimeout 和 BackgroundTasks

iOS4多任务开发笔记

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

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

你会在许多私有API调用中看到很多mach_port_t。通常,这个mach端口是进程间通信系统的一部分

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

有不同的方法来获取其他应用程序的端口。然而,对于私有API,最常见的方法是调用另一个返回端口的私有API。

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


是的,我真的应该把这个问题分成三个。非常有用的链接。谢谢!有没有关于如何快速掌握编程私有API和处理Mach端口的建议? - Russ McBride
2Russ:给我发送一封电子邮件(你可以在我的个人资料中找到我的电子邮件地址)。我会向您发送有关私有API的信息。 - Victor Ronin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接