NSURL

1、简介

  • 在文件系统中,文件和目录都是使用完整文件路径来唯一标识的。我们可以使用 NSString 和 NSURL 两种对象来描述文件路径。官方建议使用 NSURL 。
  • NSURL 是用来表示 URL 地址的类,通过 URL 我们可以定位一个远程 web 服务器上的资源位置,也可以定位硬盘上的一个本地文件的路径。
  • 对于 web 资源,往往结合 NSURLSession、NSURLConnection、NSURLDownload 等使用,对于本地资源,一般结合 NSFileManager、NSFileHandle、NSBundle 使用。
  • NSURLComponents 只支持 iOS7.0 及以上的 API 类,它可以实现对 URL 各个部分的读写。NSURLComponents 对 URL 各个部分的内容都有两种格式的属性来表示:
原生格式 URL-Encoded
scheme
host percentEncodedHost
port
path percentEncodedPath
query percentEncodedQuery
fragment percentEncodedFragment
user percentEncodedUser
password percentEncodedPassword

2、NSURL 结构:

protocol://hostname[:port]/path/[;parameters][?query]#fragment     // 带方括号[]的为可选项
protocol    :协议
hostname    :主机名
port        :端口
path        :路径
parameters  :参数
query       :查询
fragment    :信息片段
  • 如:https://swiftinaction.com/example?section=5 这个 URL 包含 scheme(https)、host(swiftinaction.com)、path(/example)、query(section=5)等若干部分。
  • 其中 URL 的 scheme 字段标识了一个 URL 所遵循的协议:
http://     超文本传输协议
https://    超文本传输安全协议
ftp://      文件传输协议
file://     本地文件 URL
data://     数据 URL

3、URL 的创建

// 由字符串创建
// 简单字符串直接创建
NSURL *url1 = [NSURL URLWithString:@"https://swiftinaction.com/example"];
NSString *complexString = @"https://swiftinaction.com/中文字符串/example";
NSString *convertString = [complexString stringByAddingPercentEncodingWithAllowedCharacters:
[NSCharacterSet characterSetWithCharactersInString:@"`#%^{}\"[]|\\<> "]];
// 由复杂字符串/中文创建时,需要对字符串进行编码转换
NSURL *url2 = [NSURL URLWithString:convertString];
// 由基础 URL 和基于基础 URL 的一个相对路径字符串创建
NSURL *baseUrl = [NSURL URLWithString:@"https://swiftinaction.com"];
NSURL *fullUrl = [NSURL URLWithString:@"/example" relativeToURL:baseUrl];
// 生成绝对路径
NSURL *url3 = [fullUrl absoluteURL];
// 由文件路径创建
// 自动判断 URL 路径为文件,还是目录,为目录时自动在路径末尾加 “/”
NSURL *url4 = [NSURL fileURLWithPath:@"/Users/JHQ0228/Desktop/test"];
// 指定 URL 路径为一个目录,自动在路径末尾加 “/”
NSURL *url5 = [NSURL fileURLWithPath:@"/Users/JHQ0228/Desktop/test" isDirectory: YES];

4、URL 的获取

NSURL *url1 = [NSURL URLWithString:@"http://JHQ:password@swiftinaction.com:8080/sayHello/toChinese.png; date=20160223?name=JHQ#atMorning"];
// 获取 URL 的 绝对路径字符串
NSString *absoluteString    = [url1 absoluteString];
// 获取 URL 的 协议类型
NSString *scheneString      = [url1 scheme];
// 获取 URL 的 主机名
NSString *hostString        = [url1 host];
// 获取 URL 的 端口
NSNumber *portString        = [url1 port];
// 获取 URL 的 路径名
NSString *pathString        = [url1 path];
// 获取 URL 的 参数
NSString *parametersString  = [url1 parameterString];
// 获取 URL 的 查询语句
NSString *queryString       = [url1 query];
// 获取 URL 的 信息片段语句
NSString *fragmentString    = [url1 fragment];
// 获取 URL 的 路径组成部分
NSArray *pathComponents     = [url1 pathComponents];
// 获取 URL 的 相对路径
NSString *relativePath      = [url1 relativePath];
// 获取 URL 的 路径最后一个组成部分
NSString *lastPathComponent = [url1 lastPathComponent];
// 获取 URL 的 路径扩展名
NSString *pathExtension     = [url1 pathExtension];
// 获取 URL 的 用户名
NSString *user              = [url1 user];
// 获取 URL 的 密码
NSString *password          = [url1 password];

5、URL 的判断

NSURL *fileUrl = [[NSBundle mainBundle] URLForResource:@"testFile" withExtension:@"txt"];
// 检查文件的可达性
/*
只能用来判断文件系统内部资源的可达性,对于 web URl 等其他类型全返回 false
*/
BOOL bl1 = [fileUrl checkResourceIsReachableAndReturnError:nil];
// 判断是否为文件 URl
BOOL bl2 = [fileUrl isFileURL];

6、URL 的路径拼接

NSURL *url = [NSURL URLWithString:@"http://swiftinaction.com/sayHello"];
// 追加路径到当前路径末尾
// 只追加路径,不在路径末尾添加 “/”
NSURL *appendUrl1 = [url URLByAppendingPathComponent:@"toJhq"];
// isDirectory 为 true 时在路径末尾添加 “/”
NSURL *appendUrl2 = [url URLByAppendingPathComponent:@"toJhq" isDirectory: YES];
// 追加路径后缀到当前路径末尾
/*
当路径以 “/” 结尾时,后缀会添加到末尾的 “/” 之前
*/
NSURL *appendUrl3 = [url URLByAppendingPathExtension:@"png"];
// 删除路径末尾的最后一个路径
NSURL *deleteUrl1 = [appendUrl1 URLByDeletingLastPathComponent];
// 删除路径末尾的后缀
NSURL *deleteUrl2 = [appendUrl3 URLByDeletingPathExtension];

7、NSURLComponents

// NSURLComponents 的创建
NSURLComponents *componentsUrl = [NSURLComponents componentsWithString:@"http://swiftinaction.com/sayHello"];
// NSURLComponents 的设置
componentsUrl.scheme = @"https";
componentsUrl.host = @"swiftinaction.com.cn";
componentsUrl.port = @8080;
componentsUrl.path = @"/sayHello/toChinese/你好";
componentsUrl.query = @"name=JHQ";
componentsUrl.fragment = @"atMorning";
componentsUrl.user = @"JHQ";
componentsUrl.password = @"123456789";
// NSURLComponents 的转换
// 将 NSURLComponents 转为 NSURL
NSURL *nsUrl = [componentsUrl URL];
NSString *componentsUrlString1 = [componentsUrl path];
// 转换为内容数据的十六进制编码字符串
NSString *componentsUrlString2 = [componentsUrl percentEncodedPath];
posted @ 2022-11-20 11:54  CH520  阅读(65)  评论(0编辑  收藏  举报