【问题标题】:iPhone SDK: How to check if IP entered by user is valid?iPhone SDK:如何检查用户输入的 IP 是否有效?
【发布时间】:2011-03-01 12:31:17
【问题描述】:

我的 iPhone 应用程序包含几个对服务器的 http 请求。用户可以输入服务器的 IP 地址,这样您就可以将应用程序与您自己的私有服务器结合使用。

在发出请求之前,我总是检查输入的 IP 地址是否有效,我会这样做:

-(BOOL)urlExists {

NSString *url = [NSString stringWithFormat:@"%@", ipAddress];
NSURLRequest *myRequest1 = [NSURLRequest requestWithURL:[NSURL URLWithString:url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0];
NSHTTPURLResponse* response = nil;
NSError* error = nil;
[NSURLConnection sendSynchronousRequest:myRequest1 returningResponse:&response error:&error];
if ([response statusCode] == 404){
    return NO;

}
else{
    return YES;
}

[url release];
[response release];
[error release];
[myRequest1 release];

}

只要输入的地址看起来像这样:xx.xx.xxx.xxx 就可以完美运行 但是,如果您尝试输入类似“1234”或“test”的内容,上面显示的代码将不起作用。所以我必须以某种方式检查输入的地址是否“看起来”像一个 IP 地址,我不知道该怎么做。

非常感谢任何建议!

【问题讨论】:

  • "1234" 无效,因为它与 "0.0.4.210" 相同,但保留了 "0.0.0/8"。最低有效地址(十进制表示法)是 16777217。但“点分十进制”并不是 IPv4 地址的唯一有效表示。

标签: iphone objective-c ip-address nsurlrequest


【解决方案1】:

您可以通过以下方法检查网址的有效性:

- (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];
}

【讨论】:

  • 我还没有真正检查过,但这不会错误地将例如 10.10.10.10.10 识别为有效吗?
  • 这不适用于带有连字符“-”符号的 URL。 :(
  • 这会错误地识别每个组件大于 256 的字符串。显然,这里的正则表达式是 错误的 想法。更不用说 IPv6
【解决方案2】:
-(BOOL)isIPAddressValid:(NSString*)ipAddress{

ipAddress = [ipAddress stringByReplacingOccurrencesOfString:@"https://" withString:@""];
ipAddress = [ipAddress stringByReplacingOccurrencesOfString:@"http://" withString:@""];

NSArray *components = [ipAddress componentsSeparatedByString:@"."];
if (components.count != 4) {
    return NO;
}
NSCharacterSet *unwantedCharacters = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet];
if ([ipAddress rangeOfCharacterFromSet:unwantedCharacters].location != NSNotFound){
    return NO;
}
for (NSString *string in components) {
    if ((string.length < 1) || (string.length > 3 )) {
        return NO;
    }
    if (string.intValue > 255) {
        return NO;
    }
}
if  ([[components objectAtIndex:0]intValue]==0){
    return NO;
}
return YES;

}

【讨论】:

    猜你喜欢
    • 2011-09-06
    • 1970-01-01
    • 2014-06-30
    • 2014-08-08
    • 1970-01-01
    • 2016-05-09
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多