iOS NSURL 的使用

作为一名开发人员,大家肯定对URL非常熟悉吧,但是有多少人对它去做过更深入的了解呢?在很多人眼里也许它就仅仅是一个URL,一个获取数据的接口而已。然而在我看来,它不仅是URL,还是一个通信链。为什么说是通信链呢,因为它可以按我自己制定的规则协议去传达我想要做的事情,尤其是在项目中解耦是非常的好用,这正是我今天所要分享的内容。相信很多人对URL并没有一个完整的认识,我先大致介绍下URL吧。

coverImage.jpg

URL的定义:

在www上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫URL(Uniform Resource Locator,统一资源定位符),它是www的统一资源定位标志,就是指网络地址。

URL的组成:

URL的一般语法格式为(带方括号[]的为可选项):
protocol://hostname[:port]/path/[;parameters][?query]#fragment
完整的、带有授权部分的普通统一资源标志符语法格式为:
协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志

URL的格式说明:

1.protocol(协议):

指定使用的传输协议,下表列出 protocol 属性的有效方案名称。 最常用的是 HTTP协议,它也是目前www中应用最广的协议。

  • http 通过 HTTP 访问该资源。 格式 http://
  • https 通过安全的 HTTPS 访问该资源。 格式 https://
  • file 资源是本地计算机上的文件。 格式 file:///(注意后边应是三个斜杠)
  • ftp 通过 FTP 访问该资源。 格式 ftp://
  • gopher 通过 Gopher 协议访问该资源。
  • mailto 资源为电子邮件地址,通过 SMTP 访问。 格式 mailto:
  • MMS 通过支持 MMS(流媒体)协议的播放该资源。(代表软件:Windows Media Player) 格式 MMS://
  • ed2k 通过支持 ed2k(专用下载链接)协议的 P2P 软件访问该资源。(代表软件:电驴) 格式 ed2k://
  • Flashget 通过支持 Flashget:(专用下载链接)协议的 P2P 软件访问该资源。(代表软件:快车) 格式 Flashget://
  • thunder 通过支持 thunder(专用下载链接)协议的 P2P 软件访问该资源。(代表软件:迅雷) 格式 thunder://
  • news 通过 NNTP 访问该资源。
2.hostname(主机名):

是指存放资源的服务器的域名系统(DNS) 主机名或 IP 地址。有时,在主机名前也可以包含连接到服务器所需的用户名和密码(格式:username:password@hostname)。

3.port(端口号):

整数,可选,省略时使用方案的默认端口,各种传输协议都有默认的端口号,如http的默认端口为80。如果输入时省略,则使用默认端口号。有时候出于安全或其他考虑,可以在服务器上对端口进行重定义,即采用非标准端口号,此时,URL中就不能省略端口号这一项。

4.path(路径):

由零或多个“/”符号隔开的字符串,一般用来表示主机上的一个目录或文件地址。

5.parameters(参数):

这是用于指定特殊参数的可选项。

6.query(查询):

可选,用于给动态网页(如使用CGI、ISAPI、PHP/JSP/ASP/ASP.NET等技术制作的网页)传递参数,可有多个参数,用“&”符号隔开,每个参数的名和值用“=”符号隔开。

7.fragment(信息片断):

字符串,用于指定网络资源中的片断。例如一个网页中有多个名词解释,可使用fragment直接定位到某一名词解释。

而在 Objective-C 中,这些组成部分可以用系统提供的方法可以很方便的获取到,而不用麻烦的处理一堆字符串,下面给大家举个栗子🌰。

    NSString *urlStr = @"https://www.testurl.com:8080/path/subpath;parms=test_parms?uid=123&gid=45#fragment=009&fragment";
    NSURL    *URL = [NSURL URLWithString:urlStr];
    NSString *absoluteString = URL.absoluteString;
    NSString *baseURL = URL.baseURL.absoluteString;
    NSString *scheme = URL.scheme;
    NSString *host = URL.host;
    NSString *path = URL.path;
    NSArray  *pathComponents = URL.pathComponents;
    NSString *lastPathComponent = URL.lastPathComponent;
    NSString *pathExtension = URL.pathExtension;
    NSString *query = URL.query;
    NSString *fragment = URL.fragment;
    NSString *parameterString = URL.parameterString;
    NSString *relativePath = URL.relativePath;
    NSString *port = [URL.port stringValue];
    NSString *user = URL.user;
    NSString *password = URL.password;
    
    // absoluteString = https://www.testurl.com:8080/path/subpath;parms=test_parms?uid=123&gid=45#fragment=009&fragment
    NSLog(@"absoluteString = %@", absoluteString);
    // baseURL = (null)
    NSLog(@"baseURL = %@", baseURL);
    // scheme = https
    NSLog(@"scheme = %@", scheme);
    // host = www.testurl.com
    NSLog(@"host = %@", host);
    // port = 8080
    NSLog(@"port = %@", port);
    // path = /path/subpath
    NSLog(@"path = %@", path);
    // pathComponents = ("/", path, subpath)
    NSLog(@"pathComponents = %@", pathComponents);
    // lastPathComponent = subpath
    NSLog(@"lastPathComponent = %@", lastPathComponent);
    // pathExtension = @""  //<object returned empty description>
    NSLog(@"pathExtension = %@", pathExtension);
    // query = uid=123&gid=45
    NSLog(@"query = %@", query);
    // fragment = fragment=009&fragment
    NSLog(@"fragment = %@", fragment);
    // relativePath = /path/subpath (The same as path if baseURL is nil)
    NSLog(@"relativePath = %@", relativePath);
    // parameterString = parms=test_parms
    NSLog(@"parameterString = %@", parameterString);
    // user = (null)
    NSLog(@"user = %@", user);
    // password = (null)
    NSLog(@"password = %@", password);

----------------------------- 分割线(下面才是重点) -----------------------------

URL的使用:

文章开头我说URL还是一个通信链,因为我可以通过一个URL可以得到我任何想要的信息,当然前提是我们得有一套规则协议去约束URL。下面举几个小例子:
协议规则:https://www.test.com/path?action=xxx&id=xxx
前缀是:https://www.test.com/path?
action:告诉我想要做的事
id:具体详情id(如果不需要的话,可以不传)
🌰1:
URL = https://www.test.com/path?action=video&id=12345
说明:https://www.test.com/path-> 前缀,action=video -> 做跳转到视频详情处理,id=12345 -> 视频id是12345。

🌰2:
URL = https://www.test.com/path?action=user&id=666
说明:https://www.test.com/path -> 前缀,action=user -> 做跳转到用户主页处理,id=666 -> 用户id是666。

当然根据你自己的需求,这个URL随便你怎么定制,比如:URL = xhc://home.com/video/detail?id=12345(跳转首页模块下的视频详情,视频id是12345),URL = xhc://store.com/goods/detail?id=88888(跳转商城模块下的商品详情,商品id是88888)
通过以上的例子大家应该知道了URL是如何传递信息的。有的同学也许会有疑问,这有什么用呢,我明明知道跳转到哪里,直接push不就得了。但是如果是动态类型的跳转呢?如果是降低耦合度呢?该如何去做。
就拿第一种情况来说(动态类型的跳转),我们在点击一个首页banner时需要根据服务端的配置数据,进行动态的跳转,配置不同,跳转页面不同。我们可以像上面这样去规划,做一个中间层去管理,也许跳转类型少看不出什么效果,但是跳转类型多的话,这种方法效果还是不错的,至少各种跳转逻辑很清晰,而且服务端也好控制。
第二种种情况(项目模块之间解耦),其实是涉及到组件化架构的,我们为了降低项目内部的耦合度,使每个模块之间解耦,为了解耦我们需要做的一件事情就是设计一个类似于路由的中间层,让Router去处理各种逻辑,在此当然不止是跳转,比如点赞,获取一个NSObject对象等等。而这个Router的设计就需要用到上面的原理,其实说白了就是按约定好的规则去解析URL,最后按各种参数返回给你,至于做什么,你自己处理,但前提是你得先注册这个URL的规则匹配,这个Router的设计有兴趣的同学可以看看蘑菇街的MGJRouter。后面我有空会把组件化架构整理一下,供大家参考理解,共同学习交流。

也许有人会问,这不就是字符串嘛,干嘛还非得搞个URL去处理。当然字符串也可以处理,但是我感觉用系统的NSURL一些方法处理起来更方便一点,获取某些参数或值的时候更简洁一点,当然这也看个人喜好和业务需求,怎样用方便,喜欢用什么就用什么,毕竟条条大路通罗马。😂😂😂

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容