当所有场景都已解除时,我如何选择在iPadOS上恢复哪个场景



我有一个iPad应用程序,我开始支持多个窗口/场景。我有一个主窗口类型,比如MainScene,还有至少一个用于打开特定类型内容的辅助窗口类型,例如DetailScene

我尚未在Info.plist中声明我的场景类型。我已经这样实现了application:configurationForConnectingSceneSession:options:

-(UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options
{
NSUserActivity *activity = options.userActivities.anyObject;
NSString *activityType = activity.activityType;
if ([activityType isEqualToString:@"detailType"])
return [DetailSceneDelegate makeSceneConfiguration];
return [MainSceneDelegate makeSceneConfiguration];
}

假设我执行以下步骤:

  1. 首次启动应用程序。我得到一个对configurationForConnectingSceneSession的调用,活动类型是nil,所以它返回一个MainScene
  2. 为某些内容打开一个新窗口。它使用详细场景活动类型,因此configurationForConnectingSceneSession返回一个DetailScene。创建新场景如下所示:
NSUserActivity *activity = [[NSUserActivity alloc] initWithActivityType:@"detailType"];
activity.userInfo = @{@"content_id": @(contentRowId)};
[[UIApplication sharedApplication] requestSceneSessionActivation:nil userActivity:activity options:nil errorHandler:nil];
  1. 暂停应用程序并打开应用程序切换器。先放弃(通过向上轻弹(主窗口,然后放弃详细信息窗口。该应用程序现已失效
  2. 重新启动应用程序

此时,我确实没有获得对configurationForConnectingSceneSession的调用。我从用户活动中恢复了详细场景,并直接调用DetailSceneDelegate

我的问题:在这种情况下,我如何控制恢复什么场景?我希望我的主要场景能回来。

邮件、邮件和笔记都可以做到这一点。如果您打开"消息"并将一个对话拖到一个新窗口中,则会为该对话打开一个窗口,该窗口的角落中会有一个"完成"按钮,该按钮将关闭该窗口。如果您使用Messages执行我上面的步骤,您将重新启动到完整的Messages视图。他们是否正在将局部视图转换为主视图?或者有没有一种方法可以告诉系统,细节场景是次要,不应该首先恢复,或者应该询问我想通过configurationForConnectingSceneSession恢复什么?还是别的什么?

我在Apple开发者论坛上交叉发布了这篇文章,并得到了框架工程师的回答。答案是UISceneActivationConditions,设置为UIScene上的属性。将canActivateForTargetContentIdentifierPredicate设置为始终返回NO:

scene.activationConditions.canActivateForTargetContentIdentifierPredicate = [NSPredicate predicateWithValue:NO];

我在UIWindowSceneDelegate实现中的scene:willConnectToSession:options:实现中这样做。

截至本文撰写之时,在Xcode 13.2和iOS 15.2模拟器上,如果第二次启动(上面的第4步(是通过点击应用程序图标,它就可以工作,但如果是通过构建和运行Xcode,它就不能工作。我可能会就此提出反馈意见。

最新更新