如何在 Swift 中为浏览器应用程序实施 URL 方案,以便它在方案 (myapp://example.com) 之后打开 URLs?
How to implement a URL Scheme for a Browser app in Swift so it opens URLs after the scheme (myapp://example.com)?
在我的浏览器应用程序中,我想制作我的应用程序 (myapp://) 的 URL 方案以打开 myapp://
部分之后的 URLs。
我想让用户使用 myapp://http://google.com
,它将打开 Google。
我在应用程序的 Info.plist 文件中设置了 URL 方案本身,并且它有效(在 Safari 中使用 myapp:// 启动应用程序)。我使用此 question:
中的此功能设置了我的 App Delegate
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
if let string = url.absoluteString {
let value = string[string.endIndex ..< string.endIndex]
NSUserDefaults.standardUserDefaults().setObject(value, forKey: AppDefaultKeys.URLSchemeRecievedURL.rawValue)
return true
}
return false
}
然后,我在 viewDidLoad 函数中使用以下代码设置我的主要 ViewController(视图所在的位置):
var _urlSchemeRecievedURL = NSUserDefaults.standardUserDefaults().stringForKey(AppDefaultKeys.URLSchemeRecievedURL.rawValue)
if _urlSchemeRecievedURL != nil {
loadURL(_urlSchemeRecievedURL!)
}
这是加载URL函数的代码:
func loadURL(urlString: String) {
let addr = NSURL(string: urlString)
if let webAddr = addr {
let req = NSURLRequest(URL: webAddr)
_webView!.loadRequest(req)
} else {
displayLoadingErrorMessage()
}
}
我使用了 NSUserDefaults,因为这是我目前知道如何将数据从 AppDelegate 传递到我的 ViewController.
的唯一方法
但有些东西不工作,因为当我在 Safari 中使用 myapp://http://google.com
时,它只会启动应用程序(没有加载 google.com)。
我也试过使用这个代码:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
if let string = url.absoluteString {
if let range = string.rangeOfString("q=") {
let value = string[range.endIndex ..< string.endIndex]
NSUserDefaults.standardUserDefaults().setObject(value, forKey: AppDefaultKeys.URLSchemeRecievedURL.rawValue)
return true
}
}
return false
}
使用 myapp://?q=http://google.com
但它也不起作用。
更新:
将代码与 ?q=
查询一起使用有效,但仅在下次启动时有效。
在下一次启动后,应用程序总是以 did URL 启动(因为它保存在 NSUserDefaults 中)。
所以现在的问题是,如何在没有 NSUserDefaults 的情况下将 URL 从 AppDelegate 传递给 ViewController?
谢谢,
PastaCoder
如果您仅在当前会话中使用 URL,我不建议将其放入 NSUserDefaults
。只需通过 属性 或 initWithURL:
方法将其传递给视图控制器。
我在 AppDelegate 中使用这段代码设法解决了这个问题:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
if let string = url.absoluteString {
if let range = string.rangeOfString("q=") {
let value = string[range.endIndex ..< string.endIndex]
println(sourceApplication!)
let viewController:ViewController = window!.rootViewController as! ViewController
viewController.loadURL(value)
return true
}
}
return false
}
我还从 ViewController 的 viewDidLoad() 函数中删除了我在问题中提到的代码。
在我的浏览器应用程序中,我想制作我的应用程序 (myapp://) 的 URL 方案以打开 myapp://
部分之后的 URLs。
我想让用户使用 myapp://http://google.com
,它将打开 Google。
我在应用程序的 Info.plist 文件中设置了 URL 方案本身,并且它有效(在 Safari 中使用 myapp:// 启动应用程序)。我使用此 question:
中的此功能设置了我的 App Delegatefunc application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
if let string = url.absoluteString {
let value = string[string.endIndex ..< string.endIndex]
NSUserDefaults.standardUserDefaults().setObject(value, forKey: AppDefaultKeys.URLSchemeRecievedURL.rawValue)
return true
}
return false
}
然后,我在 viewDidLoad 函数中使用以下代码设置我的主要 ViewController(视图所在的位置):
var _urlSchemeRecievedURL = NSUserDefaults.standardUserDefaults().stringForKey(AppDefaultKeys.URLSchemeRecievedURL.rawValue)
if _urlSchemeRecievedURL != nil {
loadURL(_urlSchemeRecievedURL!)
}
这是加载URL函数的代码:
func loadURL(urlString: String) {
let addr = NSURL(string: urlString)
if let webAddr = addr {
let req = NSURLRequest(URL: webAddr)
_webView!.loadRequest(req)
} else {
displayLoadingErrorMessage()
}
}
我使用了 NSUserDefaults,因为这是我目前知道如何将数据从 AppDelegate 传递到我的 ViewController.
的唯一方法但有些东西不工作,因为当我在 Safari 中使用 myapp://http://google.com
时,它只会启动应用程序(没有加载 google.com)。
我也试过使用这个代码:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
if let string = url.absoluteString {
if let range = string.rangeOfString("q=") {
let value = string[range.endIndex ..< string.endIndex]
NSUserDefaults.standardUserDefaults().setObject(value, forKey: AppDefaultKeys.URLSchemeRecievedURL.rawValue)
return true
}
}
return false
}
使用 myapp://?q=http://google.com
但它也不起作用。
更新:
将代码与 ?q=
查询一起使用有效,但仅在下次启动时有效。
在下一次启动后,应用程序总是以 did URL 启动(因为它保存在 NSUserDefaults 中)。
所以现在的问题是,如何在没有 NSUserDefaults 的情况下将 URL 从 AppDelegate 传递给 ViewController?
谢谢,
PastaCoder
如果您仅在当前会话中使用 URL,我不建议将其放入 NSUserDefaults
。只需通过 属性 或 initWithURL:
方法将其传递给视图控制器。
我在 AppDelegate 中使用这段代码设法解决了这个问题:
func application(application: UIApplication, openURL url: NSURL, sourceApplication: String?, annotation: AnyObject?) -> Bool {
if let string = url.absoluteString {
if let range = string.rangeOfString("q=") {
let value = string[range.endIndex ..< string.endIndex]
println(sourceApplication!)
let viewController:ViewController = window!.rootViewController as! ViewController
viewController.loadURL(value)
return true
}
}
return false
}
我还从 ViewController 的 viewDidLoad() 函数中删除了我在问题中提到的代码。