将字符串解析为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
Jessedc.. 7
这两个字符串的处理方式不同,因为第一个字符串//
符合RFC 1808而第二个字符串不符合.
第一个字符串是标准的互联网URL,第二个字符串省略了"权限组件"(参见RFC 2396第3.2节)并立即开始路径组件,因此不符合RFC 1808.
RFC 1808定义了"相对统一资源定位符",它们是目前最常见的URI并使用以下//
格式:
:// / ; ? #
它//
是1808的必需组件,RFC 2396声明该组件//
被称为Authority Component
(参见seciton 3.2),它充当路径的顶级元素或命名空间.该路径从下一个正斜杠开始.
权限组件前面有一个双斜杠"//",并由下一个斜杠"/",问号"?"或URI的末尾终止.
使用单个正斜杠会Authority Component
立即省略并启动路径组件.
NSURL将Authority Component
URL作为主机参数公开,并提到它仅作为符合1808的URL的一部分提供:
[主机]返回值
URL的主机.如果接收方不符合RFC 1808,则返回nil.
这就是为什么NSURL
主题组件nil
处于第二种情况以及为什么路径包含冒号后的所有内容的原因.
这两个字符串的处理方式不同,因为第一个字符串//
符合RFC 1808而第二个字符串不符合.
第一个字符串是标准的互联网URL,第二个字符串省略了"权限组件"(参见RFC 2396第3.2节)并立即开始路径组件,因此不符合RFC 1808.
RFC 1808定义了"相对统一资源定位符",它们是目前最常见的URI并使用以下//
格式:
<scheme>://<net_loc>/<path>;<params>?<query>#<fragment>
它//<net_loc>
是1808的必需组件,RFC 2396声明该组件//
被称为Authority Component
(参见seciton 3.2),它充当路径的顶级元素或命名空间.该路径从下一个正斜杠开始.
权限组件前面有一个双斜杠"//",并由下一个斜杠"/",问号"?"或URI的末尾终止.
使用单个正斜杠会Authority Component
立即省略并启动路径组件.
NSURL将Authority Component
URL作为主机参数公开,并提到它仅作为符合1808的URL的一部分提供:
[主机]返回值
URL的主机.如果接收方不符合RFC 1808,则返回nil.
这就是为什么NSURL
主题组件nil
处于第二种情况以及为什么路径包含冒号后的所有内容的原因.