Запустить другое приложение без схемы URL в iphone?
Я знаю, что другие приложения могут звонить из вашего приложения через схему URL. Но не все приложения имеют зарегистрированную схему URL. Так как я могу запустить это приложение? Я разрабатываю для iPhone Jaibroken.
4 ответа
Я использовал этот способ:
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.
Существует несколько способов запустить приложение, используя идентификатор пакета.
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, поэтому я не собираюсь публиковать его.
Как я знаю, только частные API могут сделать это. Первый
@interface PrivateApi_LSApplicationWorkspace
- (bool)openApplicationWithBundleID:(id)arg1;
@end
тогда используй это
PrivateApi_LSApplicationWorkspace* _workspace;
_workspace = [NSClassFromString(@"LSApplicationWorkspace") new];
[_workspace openApplicationWithBundleID:bundleIdentifier];
Вы можете проверить https://github.com/wujianguo/iOSAppsInfo.
Я только что проверил: работает в iOS 9.3.5 и 11.2, а также этот метод не требует каких-либо включений или динамической загрузки библиотек. Полностью полагается на время выполнения obj-c. И также этот метод не требует взломанного устройства, может быть сделан с устройством xcode и бесплатной учетной записью разработчика с профилями обеспечения. Не думайте, что он пройдет процесс проверки в App Store, но может быть успешно использован для корпоративного или специального назначения и так далее.
id wrkS;
wrkS = [NSClassFromString(@"LSApplicationWorkspace") performSelector:@selector(defaultWorkspace)];
[wrkS performSelector:@selector(openApplicationWithBundleID:) withObject:@"com.apple.reminders"];