Cocoa touch 这是一个有效的URL吗?如果是,为什么NSURL不能识别它的查询?

Cocoa touch 这是一个有效的URL吗?如果是,为什么NSURL不能识别它的查询?,cocoa-touch,url,uri,nsurl,Cocoa Touch,Url,Uri,Nsurl,如果我将其传递给[NSURL URLWithString://code>并打印其查询属性,我会得到nil,但如果我在冒号(或两个或三个)后面加一个斜杠,效果会很好 这实际上是无效的URL还是NSURL中的错误 根据一些研究,它似乎是一个有效的URL。发件人: 绝对URL必须是方案,后跟“:”,后跟方案 数据,可选后跟“?”和查询 及(加上重点) 方案数据的语法取决于方案,通常是 定义在它旁边。对于相对方案,方案数据必须是 方案相对URL适用于其他方案、规范或标准 必须在零或多个URL的约束范围内

如果我将其传递给
[NSURL URLWithString://code>并打印其
查询
属性,我会得到
nil
,但如果我在冒号(或两个或三个)后面加一个斜杠,效果会很好

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

根据一些研究,它似乎是一个有效的URL。发件人:

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

及(加上重点)

方案数据的语法取决于方案,通常是 定义在它旁边。对于相对方案,方案数据必须是 方案相对URL适用于其他方案、规范或标准 必须在零或多个URL的约束范围内定义方案数据 单位


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


myscheme:?id=test
不是有效的URL,因为
myscheme
不是注册的URI方案。您可以在找到所有有效的URI方案

  • :

    本文件未规定个别方案。新URI方案的注册过程由分别定义

  • :

    计划必须注册

每个URI方案各自指定有效的方案数据,但绝对URI的语法:

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

语法定义为:

myscheme:?id=test

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

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

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

这里的好消息是,
NSURLComponents
有一个稍微不同的解析器,它会将
识别为指示示例的查询:

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

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

该URL对我来说很好。我使用myscheme:?id=test,NSURL返回非nil。当我随后编写了一个注册该方案的应用程序时,它也使用该URL成功地被调用。就我个人而言,我会一直使用scheme数据,但您似乎不必这样做。我猜问题在于url无法识别url的查询部分(更改标题以反映这一点)。可能只是将查询作为方案数据处理,但根据定义,这似乎仍然是错误的。事实证明,它存储在
NSURL
resourceSpecifier
属性中。事实上,我甚至可以省略
,它仍然会这样解释,所以这是可以接受的。只要我能得到数据,我并不在乎NSURL如何解释它。对不起,我没有仔细阅读你的问题。我在回应标题。值得一提的是,使用带有
/
的URL可能更安全,以防苹果改变这种行为,将
?id=test
解析为查询。不过,很高兴你解决了这个问题。我认为说必须注册一个方案才能使URL有效是不正确的。没有一家RFC这么说,而您引用的文件是一份“生活标准文件”,截至2013年12月底,该文件在短语旁边有一个鲜红色的方框,旁边有省略号,可能表明该声明仍在考虑和修订中。@algal:说:“每个URI都以一个方案名称开始,该名称引用用于在该方案内分配标识符的规范。”下面的一些行:“方案注册表维护方案名称与其规范之间的映射。”它引用wich在中所说的:“注册值有一个名称空间”(与过时的RFC2717定义相反)。有趣。因此,如果我们假设这意味着scheme注册表维护所有scheme名称的映射,那么如果它没有注册,那么它就不是scheme名称,然后它就不是URL。好的。但这肯定会留下大量无效但格式良好的URL浮动!)@algal:(注意,所有这些只是我在RFC中挖掘的,我在这里没有确切的知识;我希望得到纠正。)是的,我想是的。可以注册已经在使用的方案:“以前未注册的URI方案在使用中发现可能由第三方代表创建URI方案的人注册“--但是,如果没有这样一个(注册的)规范,我们只能在某种程度上知道它是否是“格式良好的”,因为scheme规范可以为URI语法定义其他规则。规范世界(设想通过网络交换公共URI)和现实世界之间似乎存在着紧张关系。后者还包括私有URL的激增,这些URL局限于一个主机甚至一个进程,它们充当命名记录和分解资源加载的DSL。OSX为个人通讯簿记录、邮件记录、日历记录等提供URL。。对我来说,所有这些都是出于我的问题:
NSURLComponents *components = [NSURLComponents componentsWithString:@"myscheme:?id=test"];
return components.query; // returns @"id=test"