Запустить другое приложение без схемы 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"];
Другие вопросы по тегам