统一的openURL for framework + app +扩展

时间:2014-08-27 11:57:04

标签: swift ios8

我有一个适用于iOS 8的Swift应用程序,它有一个应用程序组件,一个扩展组件,以及一个包含大量共享资源的框架 - 共享视图控制器,共享资源等。在框架中的某一点,我想要致电

UIApplication.sharedApplication().openURL(someURL)

但如果我在选中“仅允许应用扩展API”时这样做,则会出错,因为UIApplication.sharedApplication()在扩展中不可用。如果我取消选中该框,我会收到一个警告,即在扩展中包含框架可能不安全,而且我担心在提交时可能会导致拒绝。

如果此代码仅用于扩展,我会使用类似:

extensionContext.openURL(someURL, completionHandler: nil)

...但这不适用于独立应用,仅适用于扩展程序。

修改我的代码以确保扩展永远不会调用UIApplication.sharedApplication()。openURL()行,并且应用程序永远不会调用extensionContext.openURL()行,这是微不足道的。清除错误 - 只是扩展API框架中存在UIApplication.sharedApplication()会导致错误。

所以,在我开始研究hacks之前,是否有一个干净的解决方案让我调用openURL并采取正确的操作,而不会导致编译错误?

提前致谢!

1 个答案:

答案 0 :(得分:2)

声明一个全局的Optional闭包变量来打开共享框架中的URL。

public openURL: (NSURL->())? = nil

然后将其设置在您的应用代理application:didFinishLaunching:...中,如下所示:

openURL = { UIApplication.sharedApplication().openURL($0) }

然后您可以从以下任何地方拨打openURL

openURL?(NSURL(string: "http://stackoverflow.com/")!)

此声明对您的扩展程序无效,因为您不会在应用扩展程序流程中设置openURL