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.

Était-ce utile?

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"];

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top