How to check validity of URL in Swift?

后端 未结 22 1682
不知归路
不知归路 2020-11-29 02:05

Trying to make an app launch the default browser to a URL, but only if the URL entered is valid, otherwise it displays a message saying the URL is invalid.

How would

相关标签:
22条回答
  • 2020-11-29 02:18

    Using 'canOpenUrl' was too expensive for my use case, I found this approach to be quicker

    func isStringLink(string: String) -> Bool {
        let types: NSTextCheckingResult.CheckingType = [.link]
        let detector = try? NSDataDetector(types: types.rawValue)
        guard (detector != nil && string.characters.count > 0) else { return false }
        if detector!.numberOfMatches(in: string, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, string.characters.count)) > 0 {
            return true
        }
        return false
    }
    
    0 讨论(0)
  • 2020-11-29 02:20

    For a swift 3 version of the accepted answer:

    func verifyUrl(urlString: String?) -> Bool {
        if let urlString = urlString {
            if let url = URL(string: urlString) {
                return UIApplication.shared.canOpenURL(url)
            }
        }
        return false
    }
    

    Or for a more Swifty solution:

    func verifyUrl(urlString: String?) -> Bool {
        guard let urlString = urlString,
              let url = URL(string: urlString) else { 
            return false 
        }
    
        return UIApplication.shared.canOpenURL(url)
    }
    
    0 讨论(0)
  • 2020-11-29 02:20

    2020, I was tasked on fixing a bug of a method for underlining string links within a string. Most of the answers here don't work properly (try: aaa.com.bd or aaa.bd) These links should be valid. And then I stumbled upon the regex string for this.

    Ref: https://urlregex.com/

    So based on that regex

    "((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?"
    

    We can write a function.

    SWIFT 5.x:

    extension String {
        var validURL: Bool {
            get {
                let regEx = "((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?"
                let predicate = NSPredicate(format: "SELF MATCHES %@", argumentArray: [regEx])
                return predicate.evaluate(with: self)
            }
        }
    }
    

    OBJECTIVE-C (write this however you want, category or not).

    - (BOOL)stringIsValidURL:(NSString *)string
    {
        NSString *regEx = @"((?:http|https)://)?(?:www\\.)?[\\w\\d\\-_]+\\.\\w{2,3}(\\.\\w{2})?(/(?<=/)(?:[\\w\\d\\-./_]+)?)?";
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@" argumentArray:@[regEx]];
        return [predicate evaluateWithObject:string];
    }
    
    0 讨论(0)
  • 2020-11-29 02:20

    This accepted answer doesn't work in my case with wrong url without data https://debug-cdn.checkit4team.com/5/image/Y29tbW9uL2RlZmF1bHRfYXZhdGFyLnBuZw==

    So I write extension to solve

    extension String {
        var verifyUrl: Bool {
            get {
                let url = URL(string: self)
    
                if url == nil || NSData(contentsOf: url!) == nil {
                    return false
                } else {
                    return true
                }
            }
        }
    }
    

    Use it:

    if string. verifyUrl {
        // do something
    }
    

    Hope this help!

    0 讨论(0)
  • 2020-11-29 02:21

    I found this one clean (In Swift):

    func canOpenURL(string: String?) -> Bool {
        guard let urlString = string else {return false}
        guard let url = NSURL(string: urlString) else {return false}
        if !UIApplication.sharedApplication().canOpenURL(url) {return false}
    
        //
        let regEx = "((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+"
        let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[regEx])
        return predicate.evaluateWithObject(string)
    }
    

    Usage:

    if canOpenURL("abc") {
        print("valid url.")
    } else {
        print("invalid url.")
    }
    

    ===

    for Swift 4.1:

    func canOpenURL(_ string: String?) -> Bool {
        guard let urlString = string,
            let url = URL(string: urlString)
            else { return false }
    
        if !UIApplication.shared.canOpenURL(url) { return false }
    
        let regEx = "((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+"
        let predicate = NSPredicate(format:"SELF MATCHES %@", argumentArray:[regEx])
        return predicate.evaluate(with: string)
    }
    
    // Usage
    if canOpenURL("abc") {
        print("valid url.")
    } else {
        print("invalid url.") // This line executes
    }
    
    if canOpenURL("https://www.google.com") {
        print("valid url.") // This line executes
    } else {
        print("invalid url.")
    }
    
    0 讨论(0)
  • 2020-11-29 02:21

    This will return a boolean for a URL's validity, or nil if an optional URL with a value of nil is passed.

    extension URL {
    
        var isValid: Bool {
            get {
                return UIApplication.shared.canOpenURL(self)
            }
        }
    
    }
    

    Note that, if you plan to use a Safari view, you should test url.scheme == "http" || url.scheme == "https".

    0 讨论(0)
提交回复
热议问题