2010-09-24 24 views
15


W mojej aplikacji, gdy użytkownik doda obiekt, może również dodać łącze do tego obiektu, a następnie link można otworzyć w webView.
Próbowałem zapisać link bez prefiksu http: //, a następnie otworzyć go w webView, ale nie można go otworzyć!
Zanim rozpocznie się ładowanie WebView, czy istnieje metoda sprawdzania, czy zapisany URL ma przedrostek http: //? A jeśli go nie ma, jak mogę dodać przedrostek do adresu URL?
Dzięki!Sprawdź, czy adres URL ma przedrostek http: //

Odpowiedz

41

Można użyć metody - (BOOL)hasPrefix:(NSString *)aString na NSString aby zobaczyć czy NSString zawierające adres URL zaczyna się od http: // prefiks, a jeśli nie dodać przedrostek.

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

Jestem obecnie z dala od mojego mac i nie mogę skompilować/przetestować tego kodu, ale uważam, że powyższe powinno zadziałać.

+1

Test przerwy z "HTTP://www.google.com". Nie obsługuje także ftp: //, nawet jeśli działa UIWebView. –

+3

Myślę, że moja odpowiedź daje wystarczające informacje, że Matthew może rozwiązać swój problem. – Greg

+0

Tak, Greg, właśnie tego szukam ... Będę obsługiwał tylko protokół http, ponieważ jest to jedyny, który może służyć w mojej aplikacji ...;) – matteodv

3

Nie jestem pewien, czy istnieje metoda, aby to sprawdzić, ale sprawdzenie go w kodzie.

spróbuj

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

To może być rozwiązanie, ale ta metoda dodaje adres http: // do adresu URL ... i jeśli adres URL zawiera http: // co robi ta metoda? – matteodv

+0

Ten kod dodaje "http: //" do wszystkich adresów URL bez schematu."http: // blah" ma schemat "http", więc '[[schemat adresu URL] length]' jest niezerowy, a kod pozostawia adres URL bez zmian. –

1

Jeśli sprawdzanie „http: //”, prawdopodobnie będziesz chciał bez uwzględniania wielkości liter wyszukiwania:

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

Chociaż myślę, że check schemat URL jest lepsza odpowiedź w zależności od Państwa okoliczności, ponieważ adresy URL mogą zaczynać się od http lub https i innych prefiksów w zależności od tego, jaki jest Twój przypadek użycia.

0

Najpierw należy utworzyć nową kategorię dla NSURL: Plik> Nowy plik> Kategoria celu C. Możesz nazwać kategorię czymś na wzór HTTPURLWithString, ustawić ją jako kategorię NSURL, nacisnąć next i dodać do swojego celu. Następnie w bibliotece NSURL + HTTPURLFromString.m wdrożyć następujący komunikat (i zadeklarować wiadomość w .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 

Aby otworzyć link w WebView jest po prostu

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

pisałem o przedłużenie String w Swift, aby sprawdzić, czy adres URL ciąg dostał http lub 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

Lepiej użyć właściwości scheme na obiekcie URL:

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

Przykład użycia:

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) 
} 
Powiązane problemy