myscheme:?id=test
如果我将其传递给[NSURL URLWithString:]
并打印其query
属性,我会得到nil
,但如果我在冒号(或两三个)后面放一个斜杠就可以了
这实际上是无效的网址,还是NSURL
中的错误?
根据一些研究,它似乎是一个有效的URL。来自http://url.spec.whatwg.org/:
绝对URL必须是方案,后跟“:”,后跟方案 数据,可选地后跟“?”和查询。
和(强调添加)
方案数据的语法取决于方案,通常是 与它并列。对于相对方案,方案数据必须是a 方案相对URL。 适用于其他方案,规范或标准 必须在零或更多 URL的约束内定义方案数据 单元。
答案 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方案。
http://tools.ietf.org/html/std66#section-3.1:
本文档未指定个别方案。注册新URI方案的过程由[BCP35]单独定义。
http://url.spec.whatwg.org/#writing:
必须注册一个计划。
每个URI方案都自己指定有效的方案数据,但语法has to match是绝对URI的语法:
URI方案规范必须定义自己的 语法,以便匹配其特定于方案的语法的所有字符串 也符合语法,如Section 4.3中所述。
语法定义为:
absolute-URI = scheme ":" hier-part [ "?" query ]
但是hier-part
可能是空的(如果我没有忽略STD 66中的任何内容)。因此,如果您使用的是有效的URI方案,那么您的URI似乎是有效的(只要该URI方案没有为方案数据定义特殊规则,它可能会这样做。)