本文介绍iOS SrpintBoard框架的部分私有API,具体包括:
(1)初始化
void * uikit = dlopen("/System/Library/Framework/UIKit.framework/UIKit", RTLD_LAZY); int (*SBSSpringBoardServerPort)() = dlsym(uikit, "SBSSpringBoardServerPort"); p = (mach_port_t *)SBSSpringBoardServerPort(); dlclose(uikit); sbserv = dlopen(SBSERVPATH, RTLD_LAZY);
(2)获取iphone上所有正在运行的app的bundle id列表
NSArray* (*SBSCopyApplicationDisplayIdentifiers)(mach_port_t* port, BOOL runningApps,BOOL debuggablet) = dlsym(sbserv, "SBSCopyApplicationDisplayIdentifiers"); NSArray *currentRunningAppBundleIdArray= SBSCopyApplicationDisplayIdentifiers(p,NO,YES);
(3)得到iphone 前台运行的app的bundle id
void* (*SBFrontmostApplicationDisplayIdentifier)(mach_port_t* port,char * result) = dlsym(sbserv, "SBFrontmostApplicationDisplayIdentifier"); char topapp[256];
SBFrontmostApplicationDisplayIdentifier(p,topapp); currentTopAppBundleId=[NSStringstringWithFormat:@"%s",topapp];
(4)根据iphone app的bundle id得到其app名称
NSString * (*SBSCopyLocalizedApplicationNameForDisplayIdentifier)(NSString* ) = dlsym(sbserv, "SBSCopyLocalizedApplicationNameForDisplayIdentifier"); NSString *strAppName = SBSCopyLocalizedApplicationNameForDisplayIdentifier(strBundleId);
(5)根据iphone app 的bundle id得到其图标
NSData* (*SBSCopyIconImagePNGDataForDisplayIdentifier)(NSString * bundleid) = dlsym(sbserv, "SBSCopyIconImagePNGDataForDisplayIdentifier"); UIImage *icon = nil; NSData *iconData = SBSCopyIconImagePNGDataForDisplayIdentifier(bundleid); if (iconData != nil) { icon = [UIImage imageWithData:iconData]; } return icon;
(6)直接通过app 的bundle id来运行该app
在ios中,一个app调起另一个app的方式通常是用url scheme,但是用这个 私有app,可以在不需要url scheme的情况下运行任何app
-(void)openAppByBundleId:(NSString*)bundleId { void* sbServices = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices", RTLD_LAZY); int (*SBSLaunchApplicationWithIdentifier)(CFStringRef identifier, Boolean suspended) = dlsym(sbServices, "SBSLaunchApplicationWithIdentifier"); const char *strBundleId = [bundleId cStringUsingEncoding:NSUTF8StringEncoding]; int result = SBSLaunchApplicationWithIdentifier((__bridge CFStringRef)bundleId, NO); dlclose(sbServices); }