有时候,我们的程序需要向springboard发送消息,这个可以用SpringBoardServices.framework库(这个是私有的库,有关这个库的介绍参见http://iphonedevwiki.net/index.php/SpringBoardServices.framework),网上的一般的方法是
#import <UIKit/UIKit.h>
#import <UIKit/UIApplication.h>
#include <dlfcn.h>
#include <stdio.h>
// Framework Paths
#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
#define UIKITPATH "/System/Library/Framework/UIKit.framework/UIKit"
int main(int argc, char **argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
//
// For testing try issuing the following:
// ap y; sleep 5; ./ap n
//
if (argc < 2)
{
printf("Usage: %s (y | n)/n", argv[0]);
exit(-1);
}
// Argument used to switch airplane mode off or on
BOOL yorn = [[[NSString stringWithCString:argv[1]]
uppercaseString] hasPrefix:@"Y"];
// Fetch the SpringBoard server port
mach_port_t *p;
void *uikit = dlopen(UIKITPATH, RTLD_LAZY);
int (*SBSSpringBoardServerPort)() =
dlsym(uikit, "SBSSpringBoardServerPort");
p = SBSSpringBoardServerPort();
dlclose(uikit);
// Link to SBSetAirplaneModeEnabled
void *sbserv = dlopen(SBSERVPATH, RTLD_LAZY);
int (*setAPMode)(mach_port_t* port, BOOL yorn) =
dlsym(sbserv, "SBSetAirplaneModeEnabled");
setAPMode(p, yorn);
dlclose(sbserv);
[pool release];
}
以上是通过动态加载的方式
其实也可以用另外一种方式
做法如下
1。用class-dump导出SpringBoardServices.framework库的头文件(比如导出3.0sdk的,class-dump -H /Developer/xcode_3_2_3/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS3.0.sdk/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices -o ~/Desktop/springboard,对于此命令我就不解释了,各位看客可以自己google),在SpringBoardServices.framework下新建一个Headers目录,将刚导出的头文件放到Header目录下
进入你的程序,将SpringBoardServices.framework增加进来,
在你程序的最上方加上
extern "C" int SBSSpringBoardServerPort();
你就可以使用SBSSpringBoardServerPort();这个函数了,此函数很有用,当你想在你的程序中向springboard发送消息时,消息都需要一个参数mach_port_t变量,这个mach_port_t变量就是SBSSpringBoardServerPort();的返回值,至于能够发送那些消息给springboard,可以参见http://iphonedevwiki.net/index.php/SpringBoard.app/MIG_subsystem