通过快速操作处理应用程序启动的正确方法

时间:2016-09-14 20:23:34

标签: ios objective-c 3dtouch quickaction uiapplicationshortcutitem

当我快速启动应用程序时,我很难弄清楚如何让我的快速操作正常工作。

但是,如果应用程序处于后台并通过快速操作重新启动,我的快速操作就会起作用。

当我尝试直接从快速操作启动应用程序时,只需点按应用程序图标即可打开该应用程序(即它无效)。

以下是我的App Delegate中的一些代码。

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;
        }
    }
}

需要执行的唯一操作是我的页面视图控制器(嵌入在conferenceVC中)应该切换到相对于所选快捷方式的特定页面。

有什么原因导致快捷方式在使用它时无法执行任何操作而不是从后台重新打开应用程序?

1 个答案:

答案 0 :(得分:0)

我开始意识到我试图在一个尚未在内存中的视图控制器上调用我的方法。这导致我的应用程序中出现奇怪的行为。我确实有正确的方法来访问视图控制器,然后我意识到尝试使用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];
    });

以上工作就像魔法一样,快捷方式正在通向正确的页面。使用类似的方法可以为任何想要通过启动应用程序来使其快捷方式工作的人产生预期的结果。