Завершение работы одного или нескольких приложений вне настройки переключателя iOS 7

Я разрабатываю твики для взломанного iphone, iOS 7, и у меня есть проблема, которую я не могу решить какое-то время, можно ли закрыть все приложения, работающие в фоновом режиме, прямо из Springboard, не открывая панель переключателя фона? Все настройки и исходные коды, которые я видел, такие как Purge, Slide2Kill, работают с панели переключателя приложений, используя себя в качестве контроллера.

Я пробовал следующие способы:

SBAppSliderController* switcherController = MSHookIvar<SBAppSliderController*>(self, "_switcherController");
//or
SBUIController *sharedUI = [objc_getClass("SBUIController") sharedInstance];

SBAppSliderController * switcherController = [sharedUI _appSliderController]; 
//tried this:
SBAppSliderController * switcherController = [sharedUI _switcherController]; 
//and 
SBAppSliderController * switcherController = MSHookIvar<SBAppSliderController *>(sharedUI, "_switcherController");

Чтобы выйти из всех приложений, мне нужно вызвать _quitAppAtIndex со всеми доступными индексами приложений.

[switcherController _quitAppAtIndex:appIndex];

%hook SBAppSliderController
- (void)_quitAppAtIndex:(unsigned int)arg1 
{
      %log;
   if (arg1 == 0) {
      for (NSString *appID in [self applicationList]) {
        if (![appID isEqualToString:@"com.apple.springboard"])
            [self _quitAppAtIndex:[[self applicationList] indexOfObject:appID]];
      }
   }
   else
    %orig;
}

Каждый раз, когда я вызываю функцию, я получаю следующую ошибку, даже если я хочу закрыть только одно приложение, и я вызываю его с определенным индексом:

: -[ _quitAppAtIndex:1] : * Завершение работы приложения из-за необработанного исключения "NSInvalidArgumentException", причина: "* -[__NSDictionaryM removeObjectForKey:]: ключ не может быть нулевым"

Что я делаю неправильно? любая помощь будет оценена

Спасибо.


person GLev    schedule 22.02.2014    source источник


Ответы (1)


Сначала вам нужно переключить переключатель, этот код работает для меня:

static SBAppSliderController *_localSBAppSliderC = nil;
%hook SBAppSliderController
-(id)init { 
    %log; 
    id r = %orig; 
    _localSBAppSliderC = (SBAppSliderController *)r;
    NSLog(@" = %@", r); 
    return r;  
}
%end

-(void) KillAllApps {
  SBUIController * SBUIC = [objc_getClass("SBUIController") sharedInstance];
  [SBUIC _toggleSwitcher];
  if (_localSBAppSliderC) {
    NSLog(@"----------applist %@",[_localSBAppSliderC applicationList]);
    for (NSString *identifier in [_localSBAppSliderC applicationList]) {
      if ( ![identifier isEqualToString:@"com.apple.springboard"] )
      {
        int index = [[_localSBAppSliderC applicationList] indexOfObject:identifier];
        NSLog(@"---_quitAppAtIndex: %d",index);
        [_localSBAppSliderC _quitAppAtIndex:index];          
      }
    }
  [SBUIC dismissSwitcherAnimated:YES]; 
}
person jmdasilvas    schedule 04.08.2014