Правильный способ быстрого запуска приложений
Мне трудно понять, как заставить мои быстрые действия работать, когда я запускаю свое приложение с быстрым действием.
Мои быстрые действия работают, однако, если приложение было в фоновом режиме и перезапущено с быстрым действием.
Когда я пытаюсь запустить приложение прямо из быстрого действия, оно открывается так, как если бы оно было запущено простым нажатием на значок приложения (т.е. ничего не происходит).
Вот некоторый код от моего делегата приложения.
В didFinishLaunchingWithOptions:
UIApplicationShortcutItem *shortcut = launchOptions[UIApplicationLaunchOptionsShortcutItemKey];
if(shortcut != nil){
performShortcutDelegate = NO;
[self performQuickAction: shortcut fromLaunch:YES];
}
Метод называется:
-(BOOL) performQuickAction: (UIApplicationShortcutItem *)shortcutItem fromLaunch:(BOOL)launchedFromInactive {
NSMutableArray *meetings = [self.fetchedResultController.fetchedObjects mutableCopy];
[meetings removeObjectAtIndex:0];
unsigned long count = meetings.count;
BOOL quickActionHandled = NO;
if(count > 0){
MainViewController *mainVC = (MainViewController *)self.window.rootViewController;
if(launchedFromInactive){
mainVC.shortcut = shortcutItem;
}
else{
UINavigationController *childNav;
MeetingViewController *meetingVC;
for(int i = 0; i < mainVC.childViewControllers.count; i++){
if([mainVC.childViewControllers[i] isKindOfClass: [UINavigationController class]]){
childNav = mainVC.childViewControllers[i];
meetingVC = childNav.childViewControllers[0];
break;
}
}
self.shortcutDelegate = meetingVC;
if ([shortcutItem.type isEqual: @"Meeting"]){
NSNumber *index = [shortcutItem.userInfo objectForKey:@"Index"];
[self.shortcutDelegate switchToCorrectPageWithIndex: index launchedFromInactive:NO];
quickActionHandled = YES;
}
}
}
Единственное действие, которое необходимо выполнить, это то, что мой контроллер просмотра страниц (который встроен в MeetingVC) должен переключиться на определенную страницу в соответствии с выбранным ярлыком.
Любые идеи о том, что заставляет ярлык не делать ничего при использовании его для запуска, в отличие от повторного открытия приложения из фона?
1 ответ
Я понял, что пытаюсь вызвать свои методы на контроллере представления, которого еще не было в памяти. Это вызывало странное поведение в моем приложении. У меня действительно был правильный подход к получению доступа к контроллеру представления, и затем меня осенило возможность попытаться выполнить код с использованием GCD.
__block MeetingViewController *safeSelf = self;
contentVC = [self initializeContentViewController: self.didLaunchFromInactive withPageIndex: intIndex];
NSArray *viewControllers = @[contentVC];
dispatch_async(dispatch_get_main_queue(), ^{
[safeSelf.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
});
Все вышеперечисленное работает как по волшебству, а ярлыки ведут на правильную страницу. Надеюсь, что использование аналогичного подхода позволит получить желаемые результаты для тех, кто хочет, чтобы их ярлыки работали, запуская приложение.