尝试使用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)
}
答案 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)