2010-09-24 8 views
15


Trong ứng dụng của tôi, khi người dùng thêm đối tượng, cũng có thể thêm liên kết cho đối tượng này và sau đó liên kết có thể được mở trong webView.
Tôi đã cố lưu một liên kết không có tiền tố http: //, sau đó mở nó trong webView nhưng không thể mở nó!
Trước khi webView bắt đầu tải, có phương pháp kiểm tra xem URL đã lưu có tiền tố http: // không? Và nếu nó không có nó, làm thế nào tôi có thể thêm tiền tố vào URL?
Cảm ơn!Kiểm tra xem URL có http: // tiền tố

Trả lời

41

Bạn có thể sử dụng phương pháp - (BOOL)hasPrefix:(NSString *)aString trên NSString để xem nếu một NSString chứa URL của bạn bắt đầu với http: // tiền tố, và nếu không muốn nói thêm tiền tố.

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

Tôi hiện đang ở xa máy Mac của mình và không thể biên dịch/kiểm tra mã này, nhưng tôi tin rằng điều trên sẽ hiệu quả.

+1

thử nghiệm này phá vỡ với "HTTP://www.google.com". Nó cũng không hỗ trợ ftp: //, mặc dù UIWebView có. –

+3

Tôi nghĩ rằng câu trả lời của tôi cung cấp đầy đủ thông tin mà Matthew có thể giải quyết vấn đề của mình. – Greg

+0

Có Greg, đó là những gì tôi đang tìm kiếm ... Tôi sẽ chỉ hỗ trợ giao thức http vì nó là giao thức duy nhất có thể phục vụ trong ứng dụng của tôi ...;) – matteodv

3

Tôi không chắc chắn nếu có bất kỳ phương pháp nào để kiểm tra nhưng bạn kiểm tra nó trong mã.

hãy thử sử dụng

NSRange range = [urlString rangeOfString:@"http://"]; 
if (range.location != NSNotFound) 
    // Add http:// 
13
NSString * urlString = ...; 
NSURL * url = [NSURL URLWithString:urlString]; 
if (![[url scheme] length]) 
{ 
    url = [NSURL URLWithString:[@"http://" stringByAppendingString:urlString]]; 
} 
+0

Đây có thể là giải pháp nhưng phương pháp này thêm http: // vào URL ... và nếu URL đã có http: // phương pháp này làm gì? – matteodv

+0

Mã này thêm "http: //" vào tất cả các URL không có lược đồ."http: // blah" có lược đồ "http", vì vậy '[[url scheme] length]' là khác 0 và mã rời khỏi URL. –

1

Nếu bạn đang kiểm tra cho "http: //" có thể bạn sẽ muốn case-insensitive tìm kiếm:

// probably better to check for just http instead of http:// 
NSRange prefixRange = 
    [temp rangeOfString:@"http" 
       options:(NSAnchoredSearch | NSCaseInsensitiveSearch)]; 
if (prefixRange.location == NSNotFound) 

Mặc dù tôi nghĩ rằng việc kiểm tra chương trình url là một câu trả lời tốt hơn tùy thuộc vào bạn hoàn cảnh, vì URL có thể bắt đầu bằng http hoặc https và các tiền tố khác tùy thuộc vào trường hợp sử dụng của bạn.

0

Trước tiên, bạn nên tạo một danh mục mới cho NSURL: Tệp> Tệp mới> Danh mục-C Danh mục. Bạn có thể gọi danh mục nào đó dọc theo các dòng của HTTPURLWithString, biến nó thành danh mục của NSURL, nhấn tiếp theo và thêm nó vào mục tiêu của bạn. Sau đó, trong NSURL + HTTPURLFromString.m thực hiện được thông báo sau (và tuyên bố sứ điệp trong .h của bạn)

@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 

Để mở một liên kết trong WebView chỉ đơn giản là

NSString *urlString = @"www.google.com"; 
NSURL *url = [NSURL HTTPURLFromString:urlString]; 
NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
[webView.mainFrame loadRequest:request]; 
3

tôi đã viết một phần mở rộng cho string trong Swift, để xem nếu chuỗi url có http hoặc https

extension String{ 

    func isValidForUrl()->Bool{ 

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

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

tốt hơn để sử dụng scheme tài sản trên các đối tượng URL:

extension URL { 
    var isHTTPScheme: Bool { 
     return scheme?.contains("http") == true 
    } 
} 

sử dụng Ví dụ:

let myURL = 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) 
}