在 iOS 6.x 之前,我曾经open package_id
在 iOS 设备上从命令行打开应用程序。在 iOS 6.x 上,如果我使用此命令 SpringBoard 会崩溃。Open 可从 BigBoss 获得,作者是 Conrad Kramer。
open
BigBoss的命令是否有替代方案或修复方案?
看起来原版/usr/bin/open
已经在 Cydia 上针对 iOS 6 进行了更新,所以我建议您先尝试一下。
我也想念open
!但是,在它为 iOS 6 更新之前,您可以构建自己的非图形应用程序(只是一个main
程序,而不是一个UIApplicationMain()
)并自己做同样的事情。
我将跳过从 解析命令行参数int main(int argc, char *argv[]
,但是一旦您知道要打开的应用程序的Bundle Id ( ),打开SpringBoardServices私有框架,并使用它来启动应用程序:CFBundleIdentifier
#include <dlfcn.h>
#define SBSERVPATH "/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices"
-(void) openApp: (NSString*) bundleId {
// the SpringboardServices.framework private framework can launch apps,
// so we open it dynamically and find SBSLaunchApplicationWithIdentifier()
void* sbServices = dlopen(SBSERVPATH, RTLD_LAZY);
int (*SBSLaunchApplicationWithIdentifier)(CFStringRef identifier, Boolean suspended) = dlsym(sbServices, "SBSLaunchApplicationWithIdentifier");
int result = SBSLaunchApplicationWithIdentifier((__bridge CFStringRef)bundleId, false);
dlclose(sbServices);
}
此代码需要com.apple.springboard.launchapplications
您的命令行程序以mobile
用户身份成功使用它的权利。 有关添加权利的信息,请参见此处。您的可执行文件需要一个 entitlements.xml 文件,如下所示:
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.springboard.launchapplications</key>
<true/>
</dict>
</plist>
然后用
ldid -Sentitlements.xml MyCommandLineTool
注意:我没有对此进行测试,但这个答案表明使用权利的替代方法是以 root 身份运行命令。