我知道其他应用程序可以通过URL架构从您的应用程序调用。但并非所有应用程序都是注册的架构URL。那么我该如何启动该应用程序呢? 我正在为iphone jaibroken开发。
答案 0 :(得分:6)
使用Bundle ID可以通过多种方式启动应用程序。
SBApplication *app = [[objc_getClass("SBApplicationController") sharedInstance] applicationWithDisplayIdentifier:@"com.wrightscs.someapp"];
[[objc_getClass("SBUIController") sharedInstance] activateApplicationFromSwitcher: app];
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];
答案 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"];