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