Question

I want to implement a lockscreen tweak for the iPhone. On the lockscreen, I added a button which can unlock the screen and open the phone app. The code of this button action is:

[self unlockWithSound:YES];
int (*openApp)(CFStringRef, Boolean);
void* sbServices = dlopen("/System/Library/PrivateFrameworks/SpringBoardServices.framework/SpringBoardServices", RTLD_LAZY);
openApp= (int(*)(CFStringRef, Boolean))dlsym(sbServices,"SBSLaunchApplicationWithIdentifier");
openApp(CFSTR("com.apple.mobilephone"), FALSE);
dlclose(sbServices);

But when I tap this button to execute this code, iOS crashes and reboots in several seconds. My iPhone is running iOS 6, regularly jailbroken.

I saw this in the syslog file when I executed the code in background thread:

Entitlement com.apple.springboard.launchapplications required to use kern_return_t    _SBXXLaunchApplication(mach_port_t, char *, sbs_url_string_t, sbs_property_list_data_t, mach_msg_type_number_t, sbs_property_list_data_t, mach_msg_type_number_t, SBSApplicationLaunchFlags, SBSApplicationLaunchError *, audit_token_t)

and in main thread:

Oct 31 11:11:40 Kevin-Yes-iPhone lockdownd[41]: 2fe93000 _receive_message: walk away - non-SSL 1
Oct 31 11:12:13 Kevin-Yes-iPhone profiled[163]: (Note ) profiled: Idled. 
Oct 31 11:12:13 Kevin-Yes-iPhone profiled[163]: (Note ) profiled: Service stopping.
Oct 31 11:12:15 Kevin-Yes-iPhone securityd[363]: MS:Notice: Installing: (null) [securityd] (793.00)
Oct 31 11:12:15 Kevin-Yes-iPhone afcd[367]: Max open files: 125
Oct 31 11:12:17 Kevin-Yes-iPhone afcd[368]: Max open files: 125
Oct 31 11:12:33 Kevin-Yes-iPhone securityd[369]: MS:Notice: Installing: (null) [securityd] (793.00)
Oct 31 11:12:37 Kevin-Yes-iPhone lockdownd[41]: 2fe93000 _receive_message: walk away - non-SSL 1
Oct 31 11:13:00 Kevin-Yes-iPhone securityd[371]: MS:Notice: Installing: (null) [securityd] (793.00)

My question is: why can't my tweak execute this code? I am using iosopendev as my developing tool, is it a problem with iosopendev?

Was it helpful?

Solution 2

Here is the best way to solve my problem:

%new(v@:@)
-(void)launch:(NSString *)bundle {
    Class SBApplicationController = objc_getClass("SBApplicationController");
    id appController = [SBApplicationController sharedInstance];

    NSArray *apps = [appController applicationsWithBundleIdentifier: bundle];
    if ([apps count] > 0) {
        //Wait .5 seconds.. then launch.
        [self performSelector:@selector(launchTheApp:) withObject:[apps objectAtIndex:0] afterDelay: 0.5];
    } else {
        id app = [appController applicationWithDisplayIdentifier: bundle];
        if (app) {
            //Wait .5 seconds.. then launch.
            [self performSelector:@selector(launchTheApp:) withObject:app afterDelay: 0.5];
        }
    }
}

%new(v@:@)
-(void)launchTheApp:(id)app {
    Class SBUIController = objc_getClass("SBUIController");
    id uiController = [SBUIController sharedInstance];
    if([uiController respondsToSelector:@selector(animateLaunchApplication:)]) {
        [uiController animateLaunchApplication:app animateDefaultImage:YES];
    } else {
        [uiController activateApplicationFromSwitcher:app];
    }
}

Note: activateApplicationFromSwitcher will work better then activateApplicationAnimated

OTHER TIPS

Ok, I think I see what's going on here. You are writing a tweak that runs within the SpringBoard application. Normally, the SBSLaunchApplicationWithIdentifier() is probably (?) used to allow other, non-SpringBoard code to open an application, via SpringBoardServices.

In the case of a SpringBoard tweak, the more direct way to launch an app is probably to follow the documentation here ... although I can't test that right now. Here is another Stack Overflow answer that basically uses this technique.

The code you're trying to run does, as the message suggests, require the com.apple.springboard.launchapplications entitlement. Interestingly enough, SpringBoard itself does not have that entitlement, probably because it can just launch apps directly.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top