如何在共享应用程序扩展中获取当前窗口?

问题描述

我正在开发 iMessage 应用扩展程序,出于某些原因,我需要在此扩展程序中获取应用程序窗口。以前我是这样做的,如下所述:- guard let currentwindow : UIWindow = UIApplication.shared.keyWindow else {return}

在 xcode 12 中它运行良好。另一方面,更新到 12.5.1 后,这开始给我相同的代码错误。 如下:-

enter image description here

其次,我无法调用 UIApplication.shared.canopenURL(settingsUrl)

enter image description here

解决方法

您可以执行以下操作来测试从您的扩展程序对 UIApplication.shared 的访问:

guard UIApplication.responds(to: NSSelectorFromString("sharedApplication")) else {
    return
}
let shared = UIApplication.perform(NSSelectorFromString("sharedApplication"))?.takeUnretainedValue() as? UIApplication

通过使用 perform,您可以忽略编译器并在运行时确定您的调用。

请注意,这可能不适用于您的扩展程序。 API 不允许您默认从扩展程序访问它是有原因的,即使它在普通应用中运行良好也是如此。

您拨打 UIApplication.shared.open 也是如此。

所以最后,您可能无法使用 UIApplication.shared。主要区别在于扩展程序与应用程序。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...