iPhone SDK: проверьте правильность URL-адресов, когда NSURL не работает?

Я пытаюсь проверить, действителен ли данный URL-адрес, и я делаю это следующим образом:

- (BOOL)urlIsValid:(NSString *)address {
    NSURL *testURL = [NSURL URLWithString:address];
    if (testURL == nil) {
        return NO;
    }
    else {
        return YES;
    }
}

Поскольку «URLWithString» должен возвращать «nil», если URL-адрес искажен, я думал, что это сработает, но по какой-то причине это не так. Может кто-нибудь, пожалуйста, скажите мне, почему? Заранее спасибо!


person Chris    schedule 20.03.2011    source источник
comment
В чем искажено? Не могли бы вы опубликовать, на что вы устанавливаете address?   -  person lxt    schedule 20.03.2011
comment
адрес может быть любой строкой, введенной пользователем.   -  person Chris    schedule 20.03.2011
comment
Крис, пожалуйста, опубликуйте демонстрацию того, что должно пройти проверку, но не проходит.   -  person Moshe    schedule 20.03.2011
comment
Это хорошее решение: stackoverflow.com/questions/3791067/check-url-validity   -  person paiego    schedule 10.08.2011


Ответы (5)


проверьте, этот метод отлично работает для меня

- (BOOL) validateUrl: (NSString *) candidate {
NSString *urlRegEx =
@"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+";
NSPredicate *urlTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", urlRegEx];
return [urlTest evaluateWithObject:candidate];

}

if (![self validateUrl:strRSSurl]) {
        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Invalid url" message:[NSString stringWithFormat:@"\"%@\"",strRSSurl] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
        [alert show ];
        [alert setTag:7];
    }
    else
    {
      valid url
    }
person Sanjeev sharma    schedule 09.01.2013

Я думаю, вы можете быть смущены определением «уродство». Все, что соответствует RFC 2396, считается действительным; на практике кажется, что NSURL также будет принимать [ и ], несмотря на то, что они не разрешены RFC.

Это означает, что практически любая строка печатных символов ASCII, кроме пробела, ", %, если за ними не следуют две шестнадцатеричные цифры, <, >, \, ^, `, {, | и }, будет считаться "действительной", хотя это может не быть абсолютным или вообще полезным. Строки, содержащие несколько #, также могут быть отклонены.

person Anomie    schedule 20.03.2011

Этому нет хорошего объяснения, предоставленный вами код выглядит прекрасно и должен работать для цели, которую вы объясняете.

Что касается неверных URL-адресов, вы имеете в виду URL-адреса, которые приводят к ошибке 404, или URL-адреса с недопустимым форматированием или символами?

Приведите пример неправильно сформированного URL, который возвращает yes в этой функции.

person Emil    schedule 20.03.2011
comment
Я пытаюсь проверить URL-адрес, введенный пользователем, и обычно это делается с помощью регулярного выражения. Но я заметил, что многие люди предлагают просто использовать URLWithString, поскольку он должен возвращать nil, если URL-адрес недействителен. URL-адрес недействителен, как только в качестве URL-адреса вводится нечто подобное, например: 0000. - person Chris; 20.03.2011

По моему опыту, процедуры создания NSURL обычно выдают исключение, а не возвращают nil. Однако реальный вопрос в этом случае заключается в том, что представляет собой неверный URL-адрес? Вы проверяете, существует ли ресурс, или проверяете, соответствует ли структура строки соответствующим RFC?

Что касается первой проблемы, которую я упомянул, при создании URL-адресов, которые я не ввожу вручную, я обычно делаю это:

@try
{
    NSURL * url = [NSURL URLWithString: theString];
    // use the URL
}
@catch (NSException * e)
{
    NSLog( @"URL creation error? %@ - %@", [e name], [e reason] );
    @throw;  // throw the exception again, to hopefully get your attention
}
person Jim Dovey    schedule 20.03.2011
comment
Я никогда не видел исключения в этом случае, для каких действительных (т.е. не инициализированных локальных переменных) NSStrings это происходит? - person Matthias Bauch; 20.03.2011
comment
Если я попытаюсь создать URL-адрес, используя [NSURL URLWithString: @argleblargle], он выдает. С другой стороны, практически во всех моих программах для iOS я всегда выделяю/инициирую и явно освобождаю, так что, возможно, он выбрасывает только из -initWithString: - person Jim Dovey; 20.03.2011
comment
Ни [NSURL URLWithString: @"argleblargle"], ни [[NSURL alloc] initWithString: @"argleblargle"] не вызывают исключения, когда я пробую это здесь. В документации также прямо указано, что URLWithString: вернет nil. Вы уверены, что что-то еще в вашем коде не срабатывает при передаче нулевого NSURL? - person Anomie; 20.03.2011
comment
Это всегда брошено для меня. Может быть, это изменилось в более поздней версии iOS? Мне пришлось обернуть всю инициализацию NSURL циклами try/catch, начиная с iOS 2.0, и сгенерированные исключения были NSInvalidArgumentExceptions с причинами, упоминающими -[NSURL initWithString:]. Возможно, это было просто исправлено в iOS 4.x. - person Jim Dovey; 21.03.2011
comment
В Справочник Apple по классу NSURL для URLWithString. В OS X v10.7 и более поздних версиях или iOS 5 и более поздних версиях этот метод возвращает ноль, если строка URL-адреса равна нулю. В более ранних версиях этот метод выдает исключение, если строка URL-адреса равна нулю. - person user2067021; 03.03.2016

person    schedule
comment
это действительно блестящее решение. - person J-Q; 25.06.2015
comment
Блестящий ответ! Это идеальное решение! - person Rizwan Ahmed; 25.05.2016
comment
Это все еще работает, но NSURLConnection, похоже, устарел. Знаете ли вы решение, использующее NSURLSession или что-то еще, что не рекомендуется? - person nacho4d; 18.06.2016
comment
nacho4d, NSURLSession является заменой NSURLConnection - person alexmorhun; 09.02.2017