Search code examples
iosswiftsfsafariviewcontroller

Check if URL is valid in Swift 4


How can you check to see if a URL is valid in Swift 4? I'm building a simple web browser for personal use and even though I know to enter the full URL each time I'd rather get an alert instead of the app crashing if I forget.

import UIKit
import SafariServices

class MainViewController: UIViewController {
    @IBOutlet weak var urlTextField: UITextField!

    @IBAction func startBrowser(_ sender: Any) {
        if let url = self.urlTextField.text {
            let sfViewController = SFSafariViewController(url: NSURL(string: url)! as URL)
            self.present(sfViewController, animated: true, completion: nil)
        }
        print ("Now browsing in SFSafariViewController")
    }
}

For example, if I was to type in a web address without http:// or https:// the app would crash with the error 'NSInvalidArgumentException', reason: 'The specified URL has an unsupported scheme. Only HTTP and HTTPS URLs are supported.'


Solution

  • You're probably crashing because you're using the ! operator and not checking that it will work. Instead try:

    @IBAction func startBrowser(_ sender: Any) {
        if let urlString = self.urlTextField.text {
            let url: URL?
            if urlString.hasPrefix("http://") {
                url = URL(string: urlString)
            } else {
                url = URL(string: "http://" + urlString)
            }
            if let url = url {
                let sfViewController = SFSafariViewController(url: url)
                self.present(sfViewController, animated: true, completion: nil)
                print ("Now browsing in SFSafariViewController")
            }
        }
    }
    

    This should give you the idea of how to handle the different cases, but you probably want something more sophisticated which can deal with https and strips whitespace.