这是一个有效的URL,如果是这样,为什么NSURL无法识别其查询?

时间:2013-10-14 01:07:19

标签: cocoa-touch url uri nsurl

myscheme:?id=test

如果我将其传递给[NSURL URLWithString:]并打印其query属性,我会得到nil,但如果我在冒号(或两三个)后面放一个斜杠就可以了

这实际上是无效的网址,还是NSURL中的错误?

根据一些研究,它似乎是一个有效的URL。来自http://url.spec.whatwg.org/

  

绝对URL必须是方案,后跟“:”,后跟方案   数据,可选地后跟“?”和查询。

和(强调添加)

  

方案数据的语法取决于方案,通常是   与它并列。对于相对方案,方案数据必须是a   方案相对URL。 适用于其他方案,规范或标准   必须在零或更多 URL的约束内定义方案数据   单元。

2 个答案:

答案 0 :(得分:2)

myscheme:?id=test是一个有效的网址,NSURL通过从nil返回非+URLWithString:来识别它。

然而,通过RFC 1808,它不符合NSURL?字符识别为指示查询字符串的方式,因此-query返回nil

这里的好消息是NSURLComponents有一个稍微不同的解析器,识别?,表示您的示例的查询:

NSURLComponents *components = [NSURLComponents componentsWithString:@"myscheme:?id=test"];
return components.query; // returns @"id=test"

如果您仍然需要使用此代码定位iOS 6或更早版本,我建议使用我的KSURLComponents类,它采用相同的解析方法。

答案 1 :(得分:1)

只是回答标题中的部分(这是一个有效的URL?),而不考虑NSURL(我不知道; NSURL可能不需要有效完全是URL。

myscheme:?id=test不是有效网址,因为myscheme不是注册的URI方案。您可以在http://www.iana.org/assignments/uri-schemes.html找到所有有效的URI方案。

每个URI方案都自己指定有效的方案数据,但语法has to match是绝对URI的语法:

  

URI方案规范必须定义自己的      语法,以便匹配其特定于方案的语法的所有字符串      也符合语法,如Section 4.3中所述。

语法定义为:

absolute-URI  = scheme ":" hier-part [ "?" query ]

但是hier-part可能是空的(如果我没有忽略STD 66中的任何内容)。因此,如果您使用的是有效的URI方案,那么您的URI似乎是有效的(只要该URI方案没有为方案数据定义特殊规则,它可能会这样做。)