swift - 框架+应用+扩展的统一openURL

标签 swift ios8

我有一个适用于 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/

相关文章:

ios - 在 iOS7 上工作后,在 iOS 8 上重新加载 webView 时出错

ios - GPUImage 可用于 iOS 8 吗?

iOS8扩展后台NSURLSession沙盒报错

ios - 防止或检测从 iOS 8 键盘传递的事件

ios - 如何将用户名和电子邮件保存到 firebase

swift - 没有自动布局的 XCODE 8 中 UIScrollView 的奇怪行为

ios - Swift 3 和 lldb : Print frame of UIView, 给定十六进制地址

ios - 在 iOS 中使用 Microsoft App Center 环境变量

ios - Sandbox Swift 代码在受控环境中,错误安全

ios - iAd 插页式广告的奇怪行为