在iphone中启动没有URL架构的其他应用程序?

时间:2012-07-27 18:41:35

标签: ios xcode jailbreak iphone-privateapi

我知道其他应用程序可以通过URL架构从您的应用程序调用。但并非所有应用程序都是注册的架构URL。那么我该如何启动该应用程序呢? 我正在为iphone jaibroken开发。

4 个答案:

答案 0 :(得分:6)

使用Bundle ID可以通过多种方式启动应用程序。

SBApplication

SBApplication *app = [[objc_getClass("SBApplicationController") sharedInstance] applicationWithDisplayIdentifier:@"com.wrightscs.someapp"];
[[objc_getClass("SBUIController") sharedInstance] activateApplicationFromSwitcher: app];

SBApplicationController

SBUIController *uicontroller = (SBUIController *)[%c(SBUIController) sharedInstance];
SBApplicationController *appcontroller = (SBApplicationController *)[%c(SBApplicationController) sharedInstance];

if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)])
{
    [uicontroller activateApplicationFromSwitcher:[[appcontroller applicationsWithBundleIdentifier:bundleID] objectAtIndex:0]];
}
else
{
    // doesn't work outside of Springboard
    [uicontroller activateApplicationAnimated:[[appcontroller applicationsWithBundleIdentifier:bundleID] objectAtIndex:0]];
}

我在4.x和SBUIController中使用了另一种方法但是在5.0中停止了工作,所以我不会发布它。

答案 1 :(得分:2)

我用这种方式:

void* sbServices = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices", RTLD_LAZY);
int (*SBSLaunchApplicationWithIdentifier)(CFStringRef identifier, Boolean suspended) = dlsym(sbServices, "SBSLaunchApplicationWithIdentifier");
int result = SBSLaunchApplicationWithIdentifier((CFStringRef)bundleId, false);
dlclose(sbServices);

您需要授予您应用的权利:

 <key>com.apple.springboard.launchapplications</key>
 <true/>

它可以在iOS 6上运行。

答案 2 :(得分:2)

据我所知,只有私人api才能做到这一点。第一

@interface PrivateApi_LSApplicationWorkspace
- (bool)openApplicationWithBundleID:(id)arg1;
@end

然后使用它

PrivateApi_LSApplicationWorkspace* _workspace;
_workspace = [NSClassFromString(@"LSApplicationWorkspace") new];
[_workspace openApplicationWithBundleID:bundleIdentifier];

您可以查看https://github.com/wujianguo/iOSAppsInfo

答案 3 :(得分:0)

我刚刚测试过:在iOS 9.3.5&amp; 11.2并且该方法也不需要libs的任何包含或动态加载。完全依赖于obj-c运行时。此方法也不需要越狱设备,可以使用xcode设备和免费开发人员帐户配置配置文件。不要认为它会通过App Store审核流程,但可以成功地用于企业或临时解体等。

id wrkS;
wrkS = [NSClassFromString(@"LSApplicationWorkspace")  performSelector:@selector(defaultWorkspace)];
[wrkS performSelector:@selector(openApplicationWithBundleID:) withObject:@"com.apple.reminders"];