我应该如何确定 UIKit 将打开哪个场景,以便我可以在正确的窗口中设置我的 UI? (iOS 13+)

Posted

技术标签:

【中文标题】我应该如何确定 UIKit 将打开哪个场景,以便我可以在正确的窗口中设置我的 UI? (iOS 13+)【英文标题】:How should I determine which scene is going to be opened by UIKit so I can setup my UI in the proper window? (iOS 13+) 【发布时间】:2021-01-06 23:00:13 【问题描述】:

背景

我有一个支持多个窗口的应用程序 (iPadOS 13+),我想知道响应用户点击通知的正确方法。我想根据用户点击的通知设置 UI。

我在UNUserNotificationCenter 的共享实例上设置UNUserNotificationCenterDelegate 属性,如下所示:

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool 
    UNUserNotificationCenter.current().delegate = self
    return true

我符合UNUserNotificationCenterDelegate并实现以下方法。此方法总是在用户与通知交互时触发:

func userNotificationCenter(_ center: UNUserNotificationCenter, didReceive response: UNNotificationResponse, withCompletionHandler completionHandler: @escaping () -> Void) 
    // This gets called whenever a notification is tapped, dismissed or a custom action is performed by the user from the system Notification Center UI.
    // Should my UI setup code live here?
    completionHandler()

在名为Targeting Content with Multiple Windows 的会话中,Apple 解释说,当您的应用支持多个窗口时,系统将使用以下属性来帮助确定当用户点击通知时将向用户显示哪个窗口:

// An identifier for the content of the notification used by the system to customize the scene to be activated when tapping on a notification.
response.notification.request.content.targetContentIdentifier

UIKit 最终不会就响应用户点击通知而打开哪个场景(窗口)做出任何约定,但它会尽最大努力打开我指定的与targetContentIdentifier 最匹配的场景(窗口)通知。

如果用户在我的应用程序终止时点击通知,那么当在我的SceneDelegate 上调用以下函数时,我将能够访问SceneDelegate 内有关通知点击的信息:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    connectionOptions.notificationResponse
    // Should my UI setup code live here? 
    // I don't think so because `connectionOptions.notificationResponse` is sometimes nil and this method is only called once when the scene is being connected to a `UISceneSession`



如果我的应用没有终止,则不会调用此函数。

问题

我应该如何确定 UIKit 将打开哪个场景,以便在正确的窗口中设置我的 UI?

【问题讨论】:

【参考方案1】:

看起来UNNotificationResponse 有一个名为targetScene 的属性,要更新的场景应根据此属性确定: https://developer.apple.com/documentation/usernotifications/unnotificationresponse/3255096-targetscene

【讨论】:

以上是关于我应该如何确定 UIKit 将打开哪个场景,以便我可以在正确的窗口中设置我的 UI? (iOS 13+)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 新手确定哪个场景先出现

多路进程间通信

如何从 iOS 应用程序确定正在使用哪个苹果推送通知服务器 (APNS)

如何确定哪个查询执行时间最长

将 Cron 作业存储在哪里,它们会一直运行吗?

如何确定哪个 gem 拥有一个文件?