这很难。我一天十几次切换飞机模式,想要一个快速的方法来做到这一点。我是罕见的用户,他会杀死专用于飞机模式的物理按钮。我想尝试用音量低的按钮来做。这不会出现在应用程序商店中,我很高兴(我认为有必要)使用一些私有库。事实上,可能会发现我需要越狱手机。我正在寻找这个阶段的一般架构建议,而不是具体的代码(虽然从来没有伤害过)。
所以问题是:解决这个问题的最佳架构是什么?我这样解决问题:
1)如何让应用程序在后台运行,以便它可以监听和响应音量按钮按下(以及可能来自远程控制设备的低音量事件)。我有三个选择: - 创建一个VOIP应用程序 - 创建导航应用程序 - 创建一个音频应用程序 音频应用似乎是最合理的方式。我是否必须不断播放重复的静音音轨以保持我的应用程序在后台运行?如果我从另一个应用程序播放音轨,似乎我的应用程序已经死了。
2)如何拦截音量减小事件。这个问题的一个答案: program access to iPhone volume buttons
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开放应用程序开发”一书的更新。
感谢您与我一起思考这个问题!
答案 0 :(得分:2)
我认为,最好将其分解为多个单独的问题,因为所有问题都是无关的。
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
作为许多私有API调用的一部分。一般this mach port is part of inter process communication system
这是非常简短的解释。为了与其他应用程序通信,您需要向其发送消息,mach_port_t
是您发送这些消息的句柄。例如,setAPMode
在内部向SpringBoard应用程序发送消息,该应用程序打开/关闭飞行模式。这就是我们必须将它传递给这些函数的原因。
获取其他应用程序的端口有多种方法。但是,最常见的私有API是调用另一个私有API,它将端口返回给您。
有一个API SBSSpringBoardServerPort
,它返回Springboard服务器端口,并传递给其他Sprinboard客户端API。