【问题标题】:iPhone SDK: Check validity of URLs with NSURL not working?iPhone SDK:使用 NSURL 检查 URL 的有效性不起作用?
【发布时间】:2011-07-19 04:57:34
【问题描述】:

我正在尝试检查给定的 URL 是否有效,我正在这样做:

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

由于如果 URL 格式错误,“URLWithString”应该返回“nil”,我认为这会起作用,但由于某种原因它不起作用。有人可以告诉我为什么吗? 提前致谢!

【问题讨论】:

  • 以什么方式畸形?你能发布你设置address的内容吗?
  • 地址可以是用户输入的任意字符串。
  • 克里斯请发布一个应该通过验证但没有验证的东西的演示。
  • 这是一个很好的解决方案:stackoverflow.com/questions/3791067/check-url-validity

标签: iphone objective-c url sdk nsurl


【解决方案1】:
NSURLRequest *req = [NSURLRequest requestWithURL:[NSURL URLWithString:@"yourstring"]];
bool valid = [NSURLConnection canHandleRequest:req];

【讨论】:

  • 这真是一个绝妙的解决方案。
  • 绝妙的答案!这是完美的解决方案!
  • 这仍然有效,但 NSURLConnection 现在似乎已被弃用。您知道使用 NSURLSession 或不推荐使用的解决方案吗?
  • nacho4d,NSURLSession 是 NSURLConnection 的替代品
【解决方案2】:

检查这个方法是否适合我

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

【讨论】:

    【解决方案3】:

    我认为您可能对“畸形”的定义感到困惑。任何符合RFC 2396 的东西都被认为是有效的;在实践中,似乎 NSURL 也将接受 [],尽管 RFC 不允许它们。

    这意味着除了空格之外几乎任何可打印的 ASCII 字符字符串,"%,如果后面没有两个十六进制数字,<>\^`{|} 将被视为“有效”,尽管它可能不是绝对的或通常有用的。包含多个# 的字符串也可能会被拒绝。

    【讨论】:

      【解决方案4】:

      对此没有很好的解释,您提供的代码看起来非常好,应该可以用于您解释的目的。

      对于格式错误的 URL,您是指导致 404 错误的 URL,还是具有无效格式或字符的 URL?

      举一个在这个函数中返回yes的格式错误的URL示例。

      【讨论】:

      • 我要做的是验证用户输入的 URL,通常这是使用正则表达式完成的。但我注意到很多人建议只使用“URLWithString”,因为如果 URL 无效,它应该返回 nil。一旦输入这样的内容作为 URL,URL 就会无效,例如:“0000”。
      【解决方案5】:

      根据我的经验,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
      }
      

      【讨论】:

      • 在这种情况下我从未见过异常,对于哪个有效(即不是未初始化的局部变量)NSStrings 会发生这种情况?
      • 如果我尝试使用 [NSURL URLWithString: @"argleblargle"] 创建一个 URL,它会抛出。再说一次,在我几乎所有的 iOS 编程中,我总是分配/初始化并显式释放,所以它可能只从 -initWithString 抛出:
      • 当我在这里尝试时,[NSURL URLWithString: @"argleblargle"][[NSURL alloc] initWithString: @"argleblargle"] 都不会引发异常。该文档还明确指出 URLWithString: 将返回 nil。你确定你的代码中的其他东西在传递一个 nil NSURL 时没有抛出?
      • 它总是扔给我。也许它在更高的iOS版本中发生了变化?自 iOS 2.0 以来,我不得不使用 try/catch 循环来包装所有 NSURL 初始化,并且生成的异常是 NSInvalidArgumentExceptions,原因是 -[NSURL initWithString:]。也许它只是在 iOS 4.x 中修复。
      • Apple's NSURL class reference for URLWithString 参考中有一条注释说明“在 OS X v10.7 及更高版本或 iOS 5 及更高版本中,如果 URL 字符串为 nil,则此方法返回 nil。在早期版本中,此方法如果 URL 字符串为 nil,则抛出异常。"
      猜你喜欢
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多