【问题标题】:Using volume buttons to toggle airplane mode on iPhone使用音量按钮在 iPhone 上切换飞行模式
【发布时间】:2012-09-19 23:23:09
【问题描述】:

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

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

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

2) 如何拦截音量降低事件。这个问题的一个答案: program access to iPhone volume buttons

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 开放应用程序开发”一书的建议。

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

【问题讨论】:

标签: iphone objective-c iphone-privateapi


【解决方案1】:

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

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

这里有一些有用的链接:

iPhone - Backgrounding to poll for events

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

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

您会在许多私有 API 调用中看到很多 mach_port_t。一般this mach port is part of inter process communication system

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

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

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

【讨论】:

  • 是的,我真的应该把它分成 3 个问题。非常有用的链接。谢谢!有关如何加快私有 API 编程和处理 Mach 端口的任何建议?
  • 2Russ:给我发一封电子邮件(您可以在我的个人资料中找到我的电子邮件地址)。我会把私有 API 的信息发给你。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-28
相关资源
最近更新 更多