1
myscheme:?id=test

如果我将它传递给[NSURL URLWithString:]并打印它的query属性,我会得到nil,但是如果我在冒号(或两个或三个)后面加上一个斜杠,它就可以正常工作。

这实际上是一个无效的 URL 还是一个错误NSURL

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

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

和(强调)

方案数据的语法取决于方案,通常与方案一起定义。对于相对方案,方案数据必须是方案相对 URL。对于其他方案,规范或标准必须在零个或多个URL 单元的约束内定义方案数据。

4

2 回答 2

2

myscheme:?id=test是一个有效的 URL,并通过返回非from 来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类,它采用相同的解析方法。

于 2013-10-21T10:04:10.190 回答
1

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

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

每个 URI 方案都自己指定了有效的方案数据,但语法必须与绝对 URI 的语法相匹配:

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

语法定义为:

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

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

于 2013-10-16T10:16:52.150 回答