为什么NSURL在方案之后使用双正斜杠解析字符串与具有单个正斜杠的字符串不同?

Jes*_*edc 2 cocoa nsurl core-foundation ios nsurlcomponents

将字符串解析为NSURL对象时,NSURL使用单个正斜杠将字符串处理为与方案后面带有双正斜杠的字符串不同.

为什么会这样?

以下是一些例子:

NSURL *url = [NSURL URLWithString:@"app-id://path1/path2"];

NSLog(@"%@",url.scheme);    // "app-id"
NSLog(@"%@",url.path);      // "/path2"
NSLog(@"%@",url.host);      // "path1"


NSURL *url = [NSURL URLWithString:@"app-id:/path1/path2"];

NSLog(@"%@",url.scheme);    // "app-id"
NSLog(@"%@",url.path);      // "/path1/path2"
NSLog(@"%@",url.host);      // nil
Run Code Online (Sandbox Code Playgroud)

Jes*_*edc 7

这两个字符串的处理方式不同,因为第一个字符串//符合RFC 1808而第二个字符串不符合.

第一个字符串是标准的互联网URL,第二个字符串省略了"权限组件"(参见RFC 2396第3.2节)并立即开始路径组件,因此不符合RFC 1808.

RFC1808

RFC 1808定义了"相对统一资源定位符",它们是目前最常见的URI并使用以下//格式:

<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
Run Code Online (Sandbox Code Playgroud)

//<net_loc>是1808的必需组件,RFC 2396声明该组件//被称为Authority Component(参见seciton 3.2),它充当路径的顶级元素或命名空间.该路径从下一个正斜杠开始.

权限组件前面有一个双斜杠"//",并由下一个斜杠"/",问号"?"或URI的末尾终止.

单正斜杠

使用单个正斜杠会Authority Component立即省略并启动路径组件.

NSURL

NSURL将Authority ComponentURL作为主机参数公开,并提到它仅作为符合1808的URL的一部分提供:

[主机]返回值

URL的主机.如果接收方不符合RFC 1808,则返回nil.

这就是为什么NSURL主题组件nil处于第二种情况以及为什么路径包含冒号后的所有内容的原因.