3

在 iOS 6.x 之前,我曾经open package_id在 iOS 设备上从命令行打开应用程序。在 iOS 6.x 上,如果我使用此命令 SpringBoard 会崩溃。Open 可从 BigBoss 获得,作者是 Conrad Kramer。

openBigBoss的命令是否有替代方案或修复方案?

4

1 回答 1

7

更新:

看起来原版/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 身份运行命令

于 2013-03-16T23:13:12.407 回答