Lancer une autre application sans schéma d'URL sur iPhone?
-
12-12-2019 - |
Question
Je sais que d'autres applications peuvent appeler à partir de votre application via le schéma d'URL.Mais toutes les applications ne sont pas enregistrées Schema URL.Alors, comment puis-je lancer cette application? Je développe pour iPhone Jaibroken.
La solution
J'ai utilisé de cette façon:
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);
Et vous avez besoin de droits accordés à votre application:
<key>com.apple.springboard.launchapplications</key>
<true/>
Il peut fonctionner sur iOS 6.
Autres conseils
Vous pouvez lancer une application à l'aide de l'ID de paquet.
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]];
}
Il y avait une autre méthode que j'ai utilisée dans 4.x et geniègoDiceCode, mais qui a cessé de travailler dans 5,0, donc je ne vais pas le poster.
Comme je le sais, seule une API privée peut faire cela.Premier
@interface PrivateApi_LSApplicationWorkspace
- (bool)openApplicationWithBundleID:(id)arg1;
@end
alors utilisez-le
PrivateApi_LSApplicationWorkspace* _workspace;
_workspace = [NSClassFromString(@"LSApplicationWorkspace") new];
[_workspace openApplicationWithBundleID:bundleIdentifier];
Vous pouvez vérifier https://github.com/wujianguo/iosappsinfo .
J'ai testé juste maintenant: Travailler dans iOS 9.3.5 et 11.2 Et cette méthode ne nécessite aucune inclure ni la charge de la dynamique de LIB.Repose complètement sur l'exécution Obj-C.Et aussi, cette méthode ne nécessite pas de dispositif jailbreaké, peut être effectuée avec un périphérique Xcode et un compte de développeur gratuit avec des profilés de provisioning.Ne pensez pas que cela passerait le processus d'examen des app stores, mais peut être utilisé avec succès dans l'entreprise ou la destruction ad-hoc, etc.
id wrkS;
wrkS = [NSClassFromString(@"LSApplicationWorkspace") performSelector:@selector(defaultWorkspace)];
[wrkS performSelector:@selector(openApplicationWithBundleID:) withObject:@"com.apple.reminders"];