如何在 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() 函数中删除了我在问题中提到的代码。