2014-08-27 53 views
4

我有一個iOS 8的Swift應用程序,它有一個應用程序組件,一個擴展組件和一個包含大量共享資源的框架 - 共享視圖控制器,共享資源等。在框架的一個點,我想打電話給用於框架+應用程序+擴展的統一openURL

UIApplication.sharedApplication().openURL(someURL) 

但是,如果我這樣做,當「只允許應用程序擴展API」被選中,它錯誤,因爲UIApplication.sharedApplication()是擴展不可用。如果我取消選中該框,我會收到一個警告,說明在擴展中包含框架可能不安全,並且我擔心在提交時間時可能會導致拒絕。

如果這個代碼是在擴展只用,我會使用類似:

extensionContext.openURL(someURL, completionHandler: nil) 

...但是,這並不在獨立應用程序的工作,只有在擴展。

修改我的代碼以確保UIApplication.sharedApplication()。openURL()行永遠不會被擴展調用,並且extensionContext.openURL()行從不會被應用程序調用,但這並不「清除錯誤 - 僅在擴展API框架中存在UIApplication.sharedApplication()會導致錯誤。

因此,在我開始研究黑客之前,有沒有一種乾淨的解決方案可以讓我調用openURL並採取正確的操作,而不會導致編譯錯誤?

在此先感謝!

回答

2

聲明一個全局的Optional閉包變量來打開共享框架中的URL。

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

然後將其設置在應用程序委託的application:didFinishLaunching:...像這樣:

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

然後就可以調用openURL從任何地方像這樣:

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

該聲明將在不影響您的因爲您在應用程序擴展程序中不會設置openURL