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

标签 iphone objective-c iphone-privateapi

这是一个艰难的过程。我每天切换飞行模式十几次,想要一种快速的方式来做到这一点。我是极少数愿意为飞行模式专用的物理按钮而死的用户。我想尝试使用降低音量按钮来完成。这不会出现在应用程序商店中,我很高兴(我认为确实有必要)使用一些私有(private)库。事实上,结果可能是我需要对手机进行越狱。在这个阶段,我正在寻找一般的架构建议,而不是特定的代码(尽管这从来没有坏处)。

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

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

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

3) 如何查看飞机状态并进行更改。这个问题的旧答案有一些我不明白的 Mach 代码和动态链接: http://blogs.oreilly.com/iphone/2009/01/bring-airplane-mode-control-ba.html

了解私有(private)图书馆的最佳资源似乎在这里: http://theiphonewiki.com/wiki/index.php?title=/System/Library/Frameworks

欢迎任何关于更好的私有(private)图书馆“文档”的建议或对 Zdziarski 的“iPhone 开放应用程序开发”一书的更新。

谢谢你和我一起思考这个问题!

最佳答案

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

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

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

您会看到很多 mach_port_t 作为许多私有(private) API 调用的一部分。一般this mach port is part of inter process communication system

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

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

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

关于iphone - 使用音量按钮在 iPhone 上切换飞行模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12504222/

相关文章:

iphone - 在 iPhone 上的核心数据中存储二进制数据

ios - objective-c -单例实现示例

ios - 如何使用 Cognito 用户池注册用户 - 没有用户名和密码的 Amazon Web Services

iphone - 在 iOS7 上注入(inject)系统范围的触摸事件

iphone - 手机启动时自动加载 iPhone 应用程序

ios - 重新创建 Quora 应用程序 iOS 7 UISearchBar

iOS MPMoviePlayerController 无法判断是否暂停或自动完成播放

objective-c - OS X 辅助功能 - 如何将窗口一直带到最前面?

iphone - 有没有非私有(private) API 替代方案?

iphone - 奇怪的行为 : Message Sent to deallocated instance