您的位置:首页 > 移动开发 > Objective-C

objective-C之NSURL

2016-05-04 18:22 423 查看
一,认识url

定义

统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

结构

基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。完整的、带有授权部分的普通统一资源标志符语法看上去如下:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

1>第一部分

模式/协议(scheme):它告诉浏览器如何处理将要打开的文件。最常用的模式是超文本传输协议(Hypertext Transfer Protocol,缩写为HTTP),这个协议可以用来访问网络。其他协议如下:

http——超文本传输协议资源

https——用安全套接字层传送的超文本传输协议

ftp——文件传输协议

mailto——电子邮件地址

ldap——轻型目录访问协议搜索

file——当地电脑或网上分享的文件

news——Usenet新闻组

gopher——Gopher协议

telnet——Telnet协议

2>第二部分

文件所在的服务器的名称或IP地址,后面是到达这个文件的路径和文件本身的名称。服务器的名称或IP地址后面有时还跟一个冒号和一个端口号。它也可以包含接触服务器必须的用户名称和密码。路径部分包含等级结构的路径定义,一般来说不同部分之间以斜线(/)分隔。询问部分一般用来传送对服务器上的数据库进行动态询问时所需要的参数。

有时候,URL以斜杠“/”结尾,而没有给出文件名,在这种情况下,URL引用路径中最后一个目录中的默认文件(通常对应于主页),这个文件常常被称为 index.html 或 default.htm。

分类

1>绝对URL

绝对URL(absolute URL)显示文件的完整路径,这意味着绝对URL本身所在的位置与被引用的实际文件的位置无关,

2>相对URL

相对URL(relative URL)以包含URL本身的文件夹的位置为参考点,描述目标文件夹的位置。如果目标文件与当前页面(也就是包含URL的页面)在同一个目录,那么这个文件的相对URL仅仅是文件名和扩展名,如果目标文件在当前目录的子目录中,那么它的相对URL是子目录名,后面是斜杠,然后是目标文件的文件名和扩展名。

如果要引用文件层次结构中更高层目录中的文件,那么使用两个句点和一条斜杠。可以组合和重复使用两个句点和一条斜杠,从而引用当前文件所在的硬盘上的任何文件,

一般来说,对于同一服务器上的文件,应该总是使用相对URL,它们更容易输入,而且在将页面从本地系统转移到服务器上时更方便,只要每个文件的相对位置保持不变,链接就仍然是有效地。

二,认识NSURL

NSURL其实就是我们在浏览器上看到的网站地址,它是OC对url进行操作而封装的一个类.如果你用一个NSString类的网址字符串,初始化一个NSURL实例对象,并打印这个对象.结果和字符串没什么区别.但是NSURL有很多特有的方法可以很方便我们队NSURL对象进行操作.

相关使用

1. 一个 NSURL对象可以代表服务器上一个资源的地址,一个本地文件的路径,一块任意的编码数据;

2. 使用URL对象可以创建URL,访问URL的各个组成部分。对于代表本地文件的URL,还可以直接操作本地文件的属性,比如,修改文件的更新日期。最终,可以把URL对象传给其他API,获取它所代表的内容。例如, NSURLSession, NSURLConnection,NSURLDownload(见 URL Loading System Programming Guide)。

3. 操作本地文件时,推荐使用URL对象。 大多数操作读写文件的AppKit对象,都支持使用 NSURL作为文件引用,而不是使用路径。

比如,将本地文件的内容读取到一个NSString对象中,可以使用stringWithContentsOfURL:encoding:error:。

或者,将本地文件的内容读取到一个NSData对象中,可以使用dataWithContentsOfURL:options:error:。

4. URL还可以用于程序之间通信。在OS X上, NSWorkspace类提供了 openURL:方法,用于打开URL指定的地址。类似的,iOS中, UIApplication类也提供了 openURL:方法。

5. 此外,URL还可以用于粘贴板,见 NSURL Additions Reference(Appkit框架)。

注意: NSURL对象是跟Core Foundation对象CFURLRef无缝桥接的。

URL结构

URL可以分为多个部分
。 比如 https://www.example.com/script?name=value
可以分为URscheme(https),host地址(www.example.com),路径(/script)以及参数(name=value)。

NSURL的使用方法

1.NSURL初始化方法:

方法一:

NSURL *url=[NSURL URLWithString:@"http://www.ubluesky.com?id=1"];
方法二:

NSURL *baseURL = [NSURL URLWithString:@"file:///path/to/web_root/"];
NSURL *url = [NSURL URLWithString:@"folder/file.html" relativeToURL:baseURL];
NSURL *absURL = [url absoluteURL];
NSLog(@"absURL = %@", absURL);
可以根据一个base URL地址和关联字符串来构造URL。

参考:

NSURL *baseURL = [NSURL URLWithString:@"http://example.com/v1/"];
[[NSURL URLWithString:@"foo" relativeToURL:baseURL] absoluteURL];
// http://example.com/v1/foo [NSURL URLWithString:@"foo?bar=baz" relativeToURL:baseURL] absoluteURL];
// http://example.com/v1/foo?bar=baz [NSURL URLWithString:@"/foo" relativeToURL:baseURL] absoluteURL];
// http://example.com/foo [NSURL URLWithString:@"foo/" relativeToURL:baseURL] absoluteURL];
// http://example.com/v1/foo [NSURL URLWithString:@"/foo/" relativeToURL:baseURL] absoluteURL];
// http://example.com/foo/ [NSURL URLWithString:@"http://example2.com/" relativeToURL:baseURL] absoluteURL];
// http://example2.com/
2:解决NSURL初始化失败的相关解决方案.

将传进来的NSString 进行 UTF8 转码即可.

1>针对 URLWithString 初始化失败的解决方案

NSString *strLocalHtml = @"file:///Users/amarishuyi/Desktop/My IPhone Life/WebDeveloper/WebPlug-in/ExtEditor/DataPage/KMQT/Ext-HTMLEditor.html";
strLocalHtml = [NSString stringWithFormat:@"%@?Value=%@",strLocalHtml,self.txtUrl.text];
strLocalHtml= [strLocalHtml stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//此方法已废弃
NSURL * url=[NSURL URLWithString:strLocalHtml];
2>针对 fileURLWithPath 初始化失败的解决方案

self.filePathString = [self.filePathString stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];//此方法已废弃
NSURL *url = [NSURL fileURLWithPath:self.filePathString];
转码成功后 会自动 在字符串左侧添加 “file:///”

3:NSURL 成功初始化后可以获取的参数

NSURL *url = [NSURL URLWithString:  @"http://www.baidu.com/s?tn=baiduhome_pg&bs=NSRUL&f=8&rsv_bp=1&rsv_spt=1&wd=NSurl&inputT=2709"];
NSLog(@"Scheme: %@", [url scheme]);
NSLog(@"Host: %@", [url host]);
NSLog(@"Port: %@", [url port]);
NSLog(@"Path: %@", [url path]);
NSLog(@"Relative path: %@", [url relativePath]);
NSLog(@"Path components as array: %@", [url pathComponents]);
NSLog(@"Parameter string: %@", [url parameterString]);
NSLog(@"Query: %@", [url query]);
NSLog(@"Fragment: %@", [url fragment]);
NSLog(@"User: %@", [url user]);
NSLog(@"Password: %@", [url password]);
结果如下:

2016-05-04 16:51:44.425 URLSchemeDemo[19025:179974] Scheme: http
2016-05-04 16:51:44.426 URLSchemeDemo[19025:179974] Host: www.baidu.com
2016-05-04 16:51:44.426 URLSchemeDemo[19025:179974] Port: (null)
2016-05-04 16:51:44.426 URLSchemeDemo[19025:179974] Path: /s
2016-05-04 16:51:44.427 URLSchemeDemo[19025:179974] Relative path: /s
2016-05-04 16:51:44.427 URLSchemeDemo[19025:179974] Path components as array: (    "/",  s   )
2016-05-04 16:51:44.427 URLSchemeDemo[19025:179974] Parameter string: (null)
2016-05-04 16:51:44.427 URLSchemeDemo[19025:179974] Query: tn=baiduhome_pg&bs=NSRUL&f=8&rsv_bp=1&rsv_spt=1&wd=NSurl&inputT=2709
2016-05-04 16:51:44.427 URLSchemeDemo[19025:179974] Fragment: (null)
2016-05-04 16:51:44.427 URLSchemeDemo[19025:179974] User: (null)
2016-05-04 16:51:44.428 URLSchemeDemo[19025:179974] Password: (null)
4:根据文件名称和文件后缀获取程序包内容文件的路径

NSURL *urlKindEditor = [[NSBundle mainBundle] URLForResource:@"simple"withExtension:@"html" subdirectory:@"KindEditor/examples"];
相关参数:

URLForResource:文件名称

withExtension:文件后缀

subdirectory:在程序包中的哪个子目录中寻找.

如果没有找到将会返回nil

找到后返回如下路径:

file://localhost/Users/amarishuyi/Library/Application%20Support/iPhone%20Simulator/5.1/Applications/FB0CDABC-D0E2-45FF-AA2C-959E8A65ADB4/SmallDemoList.app/KindEditor/examples/simple.html

5:从文件做成NSURL: (hello.mov)

NSURL *url = [NSURL fileURLWithPath: [[NSBundle mainBundle] pathForResource:@"hello" ofType:@"mov"]];
6.NSString 和 NSURL的互相转换

NSString *str = @"";
NSURL *URL = [NSURL URLWithString:str];  //string->url
NSString *str1 = [URL absoluteString];   //url->string
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: