NSInternalInconsistencyException:只能有一个UIApplication实例

时间:2016-12-13 15:23:51

标签: ios swift swift3 tvos

说明

尝试使用Amt类在我的应用中打开Youtube网址。

UIApplication

问题:

为什么我尝试打开网址时应用程序崩溃了?

错误:

  

*断言失败 - [UIApplication init],   * 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因是:'只能有一个   UIApplication实例。'

编辑:不会崩溃但不会打开链接:

let url = URL(string: "https://www.youtube.com/watch?v=smOp5aK-_h0")!
let app = UIApplication()
if app.canOpenURL(url){
  //Crash here
  app.openURL(url)
}

2 个答案:

答案 0 :(得分:9)

错误在于:

  

只能有一个UIApplication实例

表示应该调用一个实例,在使用UIApplication时,它应该是shared(单例)实例。如UIApplication's Documentation中所述:

  

UIApplication类提供了一个集中的控制点和   在iOS中运行的应用程序的协调。每个应用程序都只有一个   UIApplication的一个实例(或者很少,是一个子类   UIApplication的)。启动应用程序时,系统会调用   UIApplicationMain( :)函数;在其他任务中,这个   function创建一个 Singleton UIApplication对象。此后你   通过调用shared()类方法来访问该对象。

共享()

  

所有UIApplication通知都由应用实例发布   由shared()返回。

那么您需要将let app = UIApplication()更改为let app = UIApplication.shared

let url = URL(string: "https://www.youtube.com/watch?v=smOp5aK-_h0")!
let app = UIApplication.shared
if app.canOpenURL(url) {
    app.open(url, options: [:], completionHandler: nil)
}

或者:

// for being safe, I suggest also to do "optional-binding" for the url:
if let url = URL(string: "https://www.youtube.com/watch?v=smOp5aK-_h0") {
    if UIApplication.shared.canOpenURL(url) {
        UIApplication.shared.open(url, options: [:], completionHandler: nil)
    }
}

答案 1 :(得分:1)

错误说清楚了。您必须使用默认应用程序。 UIApplication.shared.canOpenURL(url)