通过快速操作处理应用程序启动的正确方法
Correct way to handle application launching with quick actions
当我通过快速操作启动我的应用程序时,我很难弄清楚如何让我的快速操作正常工作。
但是,如果应用程序在后台并使用快速操作重新启动,我的快速操作就可以使用。
当我尝试直接从快速操作启动应用程序时,应用程序打开时就像是通过简单地点击应用程序图标启动的一样(即它什么都不做)。
这是我的 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 中)应该根据所选的快捷方式切换到特定页面。
关于是什么导致快捷方式在使用它启动而不是从后台重新打开应用程序时不执行任何操作的任何想法?
我开始意识到我正试图在一个不在内存中的视图控制器上调用我的方法。这导致我的应用程序出现奇怪的行为。我确实有正确的方法来访问视图控制器,然后我突然意识到尝试使用 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];
});
以上操作非常有效,快捷方式指向正确的页面。使用类似的方法进行挖掘有望为任何希望通过启动应用程序来使用快捷方式的其他人产生预期的结果。
当我通过快速操作启动我的应用程序时,我很难弄清楚如何让我的快速操作正常工作。
但是,如果应用程序在后台并使用快速操作重新启动,我的快速操作就可以使用。
当我尝试直接从快速操作启动应用程序时,应用程序打开时就像是通过简单地点击应用程序图标启动的一样(即它什么都不做)。
这是我的 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 中)应该根据所选的快捷方式切换到特定页面。
关于是什么导致快捷方式在使用它启动而不是从后台重新打开应用程序时不执行任何操作的任何想法?
我开始意识到我正试图在一个不在内存中的视图控制器上调用我的方法。这导致我的应用程序出现奇怪的行为。我确实有正确的方法来访问视图控制器,然后我突然意识到尝试使用 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];
});
以上操作非常有效,快捷方式指向正确的页面。使用类似的方法进行挖掘有望为任何希望通过启动应用程序来使用快捷方式的其他人产生预期的结果。