我有一个适用于 iOS 8 的 Swift 应用程序,它有一个应用程序组件、一个扩展组件和一个包含大量共享资源(共享 View Controller 、共享 Assets 等)的框架。在框架中的某个时刻,我想要打电话
UIApplication.sharedApplication().openURL(someURL)
但是,如果我在选中“仅允许应用程序扩展 API”时执行此操作,则会出错,因为 UIApplication.sharedApplication() 在扩展中不可用。如果我取消选中该框,我会收到一条警告,指出将框架包含在扩展中可能不安全,我担心这可能会导致提交时间被拒。
如果此代码仅用于扩展,我会使用如下代码:
extensionContext.openURL(someURL, completionHandler: nil)
…但这在独立应用程序中不起作用,仅在扩展程序中起作用。
修改我的代码以确保扩展程序永远不会调用 UIApplication.sharedApplication().openURL() 行是微不足道的,并且应用程序永远不会调用 extensionContext.openURL() 行,但事实并非如此清除错误 - 仅扩展 API 框架中存在 UIApplication.sharedApplication() 会导致错误。
那么,在我开始研究 hack 之前,是否有一个干净的解决方案可以让我调用 openURL 并采取正确的操作,而不会导致编译错误?
提前致谢!
最佳答案
声明一个全局 😱,可选
闭包变量以在您的共享框架中打开 URL。
public openURL: (NSURL->())? = nil
然后在您的应用委托(delegate)的 application:didFinishLaunching:...
中设置它,如下所示:
openURL = { UIApplication.sharedApplication().openURL($0) }
然后你可以像这样从任何地方调用openURL
:
openURL?(NSURL(string: "http://stackoverflow.com/")!)
此声明不会对您的扩展产生任何影响,因为您从未在应用扩展过程中设置过 openURL
。
关于swift - 框架+应用+扩展的统一openURL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25526546/