Check if an URL has got http:// prefix
You can use the - (BOOL)hasPrefix:(NSString *)aString
method on NSString to see if an NSString containing your URL starts with the http:// prefix, and if not add the prefix.
NSString *myURLString = @"www.google.com";
NSURL *myURL;
if ([myURLString.lowercaseString hasPrefix:@"http://"]) {
myURL = [NSURL URLWithString:myURLString];
} else {
myURL = [NSURL URLWithString:[NSString stringWithFormat:@"http://%@",myURLString]];
}
I'm currently away from my mac and can't compile/test this code, but I believe the above should work.
NSString * urlString = ...;
NSURL * url = [NSURL URLWithString:urlString];
if (![[url scheme] length])
{
url = [NSURL URLWithString:[@"http://" stringByAppendingString:urlString]];
}
Better to use the scheme
property on the URL
object:
extension URL {
var isHTTPScheme: Bool {
return scheme?.lowercased().contains("http") == true // or hasPrefix
}
}
Example usage:
let myURL = URL(string: "https://stackoverflow.com/a/48835119/1032372")!
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)
}
I wrote an extension for String in Swift, to see if url string got http or https
extension String{
func isValidForUrl()->Bool{
if(self.hasPrefix("http") || self.hasPrefix("https")){
return true
}
return false
}
}
if(urlString.isValidForUrl())
{
//Do the thing here.
}
I am not sure if there is any method to check that but you check it in the code.
try using
NSRange range = [urlString rangeOfString:@"http://"];
if (range.location != NSNotFound)
// Add http://
If you're checking for "http://" you'll probably want case-insensitive search:
// probably better to check for just http instead of http://
NSRange prefixRange =
[temp rangeOfString:@"http"
options:(NSAnchoredSearch | NSCaseInsensitiveSearch)];
if (prefixRange.location == NSNotFound)
Although I think the url scheme check is a better answer depending on your circumstances, as URLs can begin with http or https and other prefixes depending on what your use case is.
First, you should create a new category for NSURL: File > New File > Objective-C Category. You can call the category something along the lines of HTTPURLWithString, make it a category of NSURL, press next and add it to your target. Then in the NSURL+HTTPURLFromString.m implement the following message (and declare the message in your .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
To open a link in the WebView is simply
NSString *urlString = @"www.google.com";
NSURL *url = [NSURL HTTPURLFromString:urlString];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[webView.mainFrame loadRequest:request];
You can use scheme property for check it out. For example...
if ([yourURL.scheme isEqualToString:@"http"] || [yourURL.scheme isEqualToString:@"https"]) {
...
}
In function 'navigationAction' of WKNavigationDelegate
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)
}
}
精彩评论