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

Posted

技术标签:

【中文标题】通过快速操作处理应用程序启动的正确方法【英文标题】:Correct way to handle application launching with quick actions 【发布时间】:2016-09-14 20:23:33 【问题描述】:

当我使用快速操作启动我的应用时,我很难弄清楚如何让我的快速操作发挥作用。

但是,如果应用程序在后台并使用快速操作重新启动,我的快速操作会起作用。

当我尝试直接通过快速操作启动应用程序时,应用程序打开时就像是通过点击应用程序图标启动的一样(即它什么也不做)。

这是来自我的 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;
        
    

唯一需要执行的操作是我的页面视图控制器(嵌入在 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];
    );

上面的工作就像魔术一样,快捷方式指向正确的页面。使用类似的方法进行挖掘有望为其他任何希望通过启动应用程序来使其快捷方式工作的人产生所需的结果。

【讨论】:

以上是关于通过快速操作处理应用程序启动的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

win7应用程序无法启动提示应用程序无法启动,应用程序的并行配置不正确,

如果 Metro 应用程序被操作系统终止,启动 Metro 应用程序的正确方法是啥?

项目启动执行某些操作

快速操作 (3D Touch) 后的启动周期

在windows中下述哪些操作能用来启动一个应用程序

快速启动程序几种方法