检查URL是否有http://前缀

16
在我的应用中,当用户添加一个对象时,也可以为该对象添加一个链接,然后该链接可以在webView中打开。
我试图保存一个没有"http://"前缀的链接,然后在webView中打开它,但是无法打开!
在webView开始加载之前,有没有一种方法可以检查保存的URL是否具有http://前缀?如果没有,我该如何为URL添加前缀?
谢谢!
9个回答

43

您可以在NSString上使用- (BOOL)hasPrefix:(NSString *)aString方法,以查看包含您的URL的NSString是否以http://前缀开头,如果没有,则添加该前缀。

NSString *myURLString = @"www.google.com";
NSURL *myURL;
if ([myURLString.lowercaseString hasPrefix:@"http://"]) {
    myURL = [NSURL URLWithString:myURLString];
} else {
    myURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@",myURLString]];
}

我目前不在我的Mac旁,无法编译/测试此代码,但我相信上述代码应该是可行的。


5
我认为我的回答提供了足够的信息,让马修能够解决他的问题。 - Greg
是的 Greg,那就是我要找的... 我只支持 http 协议,因为它是唯一能在我的应用程序中使用的协议... ;) - matteodv
检查不区分大小写的前缀,请使用此链接:https://dev59.com/9Gsz5IYBdhLWcg3wYGvQ#18264768 - bobics

16
NSString * urlString = ...;
NSURL * url = [NSURL URLWithString:urlString];
if (![[url scheme] length])
{
  url = [NSURL URLWithString:[@"http://" stringByAppendingString:urlString]];
}

这可能是一个解决方案,但是这种方法会在URL前面添加http://...如果URL已经包含了http://,那么这个方法会怎么处理呢? - matteodv
这段代码会给所有没有方案的URL添加"http://"。"http://blah"有方案"http",所以`[[url scheme] length]`不为零,代码会保留URL原样。 - tc.

6
最好使用URL对象上的scheme属性:
extension URL {
    var isHTTPScheme: Bool {
        return scheme?.lowercased().contains("http") == true // or hasPrefix
    }
}

示例用法:

let myURL = URL(string: "https://dev59.com/Sm865IYBdhLWcg3wfeqU#48835119")!
if myURL.isHTTPScheme {
    // handle, e.g. open in-app browser:            
    present(SFSafariViewController(url: url), animated: true)
} else if UIApplication.shared.canOpenURL(myURL) {
    UIApplication.shared.openURL(myURL)
}

4
我用 Swift 写了一个 String 扩展,用于检查 URL 字符串是否为 http 或 https。
extension String{

    func isValidForUrl()->Bool{

        if(self.hasPrefix("http") || self.hasPrefix("https")){
            return true
        }
        return false
    }
}

if(urlString.isValidForUrl())
    {
      //Do the thing here.
}

3
我不确定是否有任何方法来检查,但你可以在代码中进行检查。 尝试使用:
NSRange range = [urlString rangeOfString:@"http://"];
if (range.location != NSNotFound)
    // Add http://  

1
如果您正在检查 "http://",您可能需要进行不区分大小写的搜索:
// probably better to check for just http instead of http://
NSRange prefixRange = 
    [temp rangeOfString:@"http" 
                options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)

尽管我认为根据您的情况进行URL方案检查是更好的答案,因为URL可能以http或https和其他前缀开头,具体取决于您的用例。

0

您可以使用scheme属性进行检查。例如...

if ([yourURL.scheme isEqualToString:@"http"] || [yourURL.scheme isEqualToString:@"https"]) {
    ...
} 

0
在 WKNavigationDelegate 的 'navigationAction' 函数中
    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
        if navigationAction.navigationType == .linkActivated {
            if let url = navigationAction.request.url {
                decisionHandler(.cancel)
                var urlString = url.absoluteString
                if urlString.lowercased().hasPrefix("http://") == false {
                    urlString = String(format: "http://%@", urlString)
                }

                let safariViewController = SFSafariViewController(url: url)
                presentInFullScreen(safariViewController, animated: true, completion: nil)
            } else {
                decisionHandler(.allow)
            }
        } else {
            decisionHandler(.allow)
        }
    }

0
首先,您应该为NSURL创建一个新类别:文件>新建文件>Objective-C类别。您可以将类别命名为HTTPURLWithString之类的名称,使其成为NSURL的类别,然后按下下一步并将其添加到您的目标中。然后在NSURL+HTTPURLFromString.m中实现以下消息(并在您的.h中声明该消息)。
@implementation NSURL (HTTPURLFromString)
+(NSURL *)HTTPURLFromString:(NSString *)string
{
    NSString *searchString = @"http";
    NSRange prefixRange = [string rangeOfString:searchString options:(NSCaseInsensitiveSearch | NSAnchoredSearch)];

    if (prefixRange.length == 4) {
        return [NSURL URLWithString:string];
    }
    return [NSURL URLWithString:[NSString stringWithFormat:@"http://%@", string]];

}
@end

在 WebView 中打开链接非常简单。
NSString *urlString = @"www.google.com";
NSURL *url = [NSURL HTTPURLFromString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView.mainFrame loadRequest:request];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接