NSUrlConnection Xcode
7.0
以后过期
. NSUrlSession ----->
第三方
: AFNetworking {
3.0
之前的
. }
1. 网络常识 / 基础 -------> 认识网络 : 七层协议 / "Socket" 通信模型 ( 本地网络地址 /MAC 地址 /IP 地址 / 子网掩码 / 路由 ...)
2. 数据解析 ( 网络数据 ---> OC 数据 )
3. HTTP 协议
4. 文件上传
5. 文件下载 (NSUrlConnection 框架 )
6. NSUrlSession/AFNetworking
7. 综合实战 ( 数据时怎么来的 )
8. HTML/CSS/JS...
问题 : 网络中传递的都是二进制数据 ! 为什么 ?
网络协议 : 因为网络协议的 " 物理层 " 只能传递电信号 :( 0 和 1 )
从上往下 :( 用户 --> 设备 ) 发送数据 : 我喜欢你 !
发送信息 : 从上往下 接收信息 : 从下往上 .
应用层 :
{
规定应用程序的数据传输格式 :
{
HTTP 协议 : 超文本传输协议 .
ftp 协议 : 本地文件的传输协议 .
本地文件传输协议 : file: //
邮件协议 : mailto: //...
}
}
表示层 :
{
不同系统之间通信的问题 ? MAC 的语法结构 和 windows 电脑的语法结构一样吗 ?
表示层解决了不同系统之间通信的语法问题 .
}
会话层 :
{
谁帮你接收信息 ? 谁帮你自动寻找 IP 地址 ...
建立一套 自动的 收发信息 , 自动网络寻址 , 自动匹配端口号 ...
}
传输层 :
{
{ 端口号 : 5001 信息内容 : 我喜欢你 }
1. 信息从计算机流出或者流入计算机的最后一条路口 ( 关口 ) 是什么 ? ------- 网卡 !
2. QQ , 微信 , 陌陌三个聊天软件 , 有一条聊天信息从网络中传递过来了 , 这个聊天信息是发送给哪一个软件 (app) 的 ?
给每一个使用网卡的应用程序一个编号 :--- 这个编号就是 " 端口 " 号 .
{
QQ: 5001
微信 : 6004
陌陌 : 7005
}
{ 端口号 : 5001 信息内容 : 我很喜欢你 }
端口号 : 0 ~ 65535 ; 0 ~ 1024 是系统占用的 . 1024 ~ 65535 : 自己设置端口号 .( 即时通信 )
TCP 协议 : 安全连接协议 / 三次握手协议 .--- 应用最广泛的传输层协议 . 效率相比于 UDP 低 . 一定能够保证接收方接受到数据 .
UDP 协议 : 报文头协议 , 是不安全的 . 只负责发送信息 , 不管接收方是否能够接收到 .
传输层数据包
{
TCP 数据包 : 标头部分除了端口号 , 还有一些安全确认机制 .
UDP 数据包 : 只有端口号 .
两者都包含标头 ( 都包含双方的 " 端口 " 号 ) 和 数据两个部分
}
}
网络层 :
{
{ 双方 :IP 地址 { 端口号 : 5001 信息内容 : 我喜欢你 }}
网络层就是建立 " 主机 " 到 " 主机 " 之间的通信 . 找到网络中唯一的一台计算机 .
如何找到网络中唯一的一台计算机呢 ? IP 地址 .
引入一套新的地址机制 : 网络地址 / 网址 /IP 地址 . 每一台计算机都有自己唯一的 IP 地址 .
IP 地址是一个大地址 : 国家 / 城市 / 县区 / 小区
MAC 地址 : 你家的门牌号
网络拓扑结构 :
IP 地址 :IP 地址来确定唯一的一台计算机
子网掩码 : 用来确定计算机所在的子网络 . 将 IP 地址与 子网掩码做 " 和 " 运算 , 得到的值就是这台计算机所在的子网络 !
61.135.169.121 : 百度服务器地址 { 百度 / 阿里 / 腾讯 : 服务器集群 }
路由 : 信息在不同的子网络之间传递 .
路由器 / 交换机 : 具有网络寻址功能 . 会帮我们寻找一条最佳的网络路径发送信息 .
DNS 服务器 : 域名解析服务器 .( 将域名解析成 IP 地址 , 域名是方便记忆 IP 地址的符号 .)
{
本机的 IP 地址 : 127.0.0.1
本机的域名 : localhost ( 没有手动配置 hosts)
IP 地址 : 通过 DHCP 协议获取的动态 IP 地址 .
通过上面三种方式 , 都可以访问到自己的计算机 .
每一台计算机都可以是一个服务器 .(MAC 系统下 , 自带了 apache 服务器 )
}
IP 数据包 :
{
标头 : 包含了双方的 IP 地址 .
数据 : 就是需要传递的数据 .
}
}
数据链路层 :
{
{ 双方的 MAC 地址 { 双方 :IP 地址 { 端口号 : 5001 信息内容 : 我喜欢你 }}}
0101010101011111100000101010101001----乱写的
单纯地 0 和 1 没有实际意思 . 必须将 0 和 1 分组 , 并且规定解读方式 .
以太网协议 : 规定了 0 和 1 的解读方式 , 规定了 " 数据包 " 的概念 : 一帧数据就是一个数据包 .
以太网协议是一个局域网协议 .
最原始的通信依靠 MAC 地址 ( 网卡地址 ).
以太网数据包会将数据封装
以太网数据包
{
标头 : 通信双方的 MAC 地址 .
数据 : 需要传递的数据内容 .
}
}
物理层 : 两台电脑如何连接在一起 ?
{
{ 双方的 MAC 地址 { 双方 :IP 地址 { 端口号 : 5001 信息内容 : 我喜欢你 }}}
{ 0101010100100010100010100010101 }
网线 /WIFI( 有线 / 无线 ---> 电信号 ( 高 ( 1 ) 低 ( 0 ) 电平 )) , 规定了网络接口类型
// 1. 物理层负责将电脑连接起来 .
// 2. 物理层负责传递数据 0 和 1.
}
信息在网络中是如何传递的 ?
{
广播 : 在同一个子网络内 , 信息以广播的形式发送 .
路由 : 信息在不同的子网络之间传递 , 就是路由 .
}
1. 网络常识 / 基础 -------> 认识网络 : 七层协议 / "Socket" 通信模型 ( 本地网络地址 /MAC 地址 /IP 地址 / 子网掩码 / 路由 ...)
2. 数据解析 ( 网络数据 ---> OC 数据 )
3. HTTP 协议
4. 文件上传
5. 文件下载 (NSUrlConnection 框架 )
6. NSUrlSession/AFNetworking
7. 综合实战 ( 数据时怎么来的 )
8. HTML/CSS/JS...
问题 : 网络中传递的都是二进制数据 ! 为什么 ?
网络协议 : 因为网络协议的 " 物理层 " 只能传递电信号 :( 0 和 1 )
从上往下 :( 用户 --> 设备 ) 发送数据 : 我喜欢你 !
发送信息 : 从上往下 接收信息 : 从下往上 .
应用层 :
{
规定应用程序的数据传输格式 :
{
HTTP 协议 : 超文本传输协议 .
ftp 协议 : 本地文件的传输协议 .
本地文件传输协议 : file: //
邮件协议 : mailto: //...
}
}
表示层 :
{
不同系统之间通信的问题 ? MAC 的语法结构 和 windows 电脑的语法结构一样吗 ?
表示层解决了不同系统之间通信的语法问题 .
}
会话层 :
{
谁帮你接收信息 ? 谁帮你自动寻找 IP 地址 ...
建立一套 自动的 收发信息 , 自动网络寻址 , 自动匹配端口号 ...
}
传输层 :
{
{ 端口号 : 5001 信息内容 : 我喜欢你 }
1. 信息从计算机流出或者流入计算机的最后一条路口 ( 关口 ) 是什么 ? ------- 网卡 !
2. QQ , 微信 , 陌陌三个聊天软件 , 有一条聊天信息从网络中传递过来了 , 这个聊天信息是发送给哪一个软件 (app) 的 ?
给每一个使用网卡的应用程序一个编号 :--- 这个编号就是 " 端口 " 号 .
{
QQ: 5001
微信 : 6004
陌陌 : 7005
}
{ 端口号 : 5001 信息内容 : 我很喜欢你 }
端口号 : 0 ~ 65535 ; 0 ~ 1024 是系统占用的 . 1024 ~ 65535 : 自己设置端口号 .( 即时通信 )
TCP 协议 : 安全连接协议 / 三次握手协议 .--- 应用最广泛的传输层协议 . 效率相比于 UDP 低 . 一定能够保证接收方接受到数据 .
UDP 协议 : 报文头协议 , 是不安全的 . 只负责发送信息 , 不管接收方是否能够接收到 .
传输层数据包
{
TCP 数据包 : 标头部分除了端口号 , 还有一些安全确认机制 .
UDP 数据包 : 只有端口号 .
两者都包含标头 ( 都包含双方的 " 端口 " 号 ) 和 数据两个部分
}
}
网络层 :
{
{ 双方 :IP 地址 { 端口号 : 5001 信息内容 : 我喜欢你 }}
网络层就是建立 " 主机 " 到 " 主机 " 之间的通信 . 找到网络中唯一的一台计算机 .
如何找到网络中唯一的一台计算机呢 ? IP 地址 .
引入一套新的地址机制 : 网络地址 / 网址 /IP 地址 . 每一台计算机都有自己唯一的 IP 地址 .
IP 地址是一个大地址 : 国家 / 城市 / 县区 / 小区
MAC 地址 : 你家的门牌号
网络拓扑结构 :
IP 地址 :IP 地址来确定唯一的一台计算机
子网掩码 : 用来确定计算机所在的子网络 . 将 IP 地址与 子网掩码做 " 和 " 运算 , 得到的值就是这台计算机所在的子网络 !
61.135.169.121 : 百度服务器地址 { 百度 / 阿里 / 腾讯 : 服务器集群 }
路由 : 信息在不同的子网络之间传递 .
路由器 / 交换机 : 具有网络寻址功能 . 会帮我们寻找一条最佳的网络路径发送信息 .
DNS 服务器 : 域名解析服务器 .( 将域名解析成 IP 地址 , 域名是方便记忆 IP 地址的符号 .)
{
本机的 IP 地址 : 127.0.0.1
本机的域名 : localhost ( 没有手动配置 hosts)
IP 地址 : 通过 DHCP 协议获取的动态 IP 地址 .
通过上面三种方式 , 都可以访问到自己的计算机 .
每一台计算机都可以是一个服务器 .(MAC 系统下 , 自带了 apache 服务器 )
}
IP 数据包 :
{
标头 : 包含了双方的 IP 地址 .
数据 : 就是需要传递的数据 .
}
}
数据链路层 :
{
{ 双方的 MAC 地址 { 双方 :IP 地址 { 端口号 : 5001 信息内容 : 我喜欢你 }}}
0101010101011111100000101010101001----乱写的
单纯地 0 和 1 没有实际意思 . 必须将 0 和 1 分组 , 并且规定解读方式 .
以太网协议 : 规定了 0 和 1 的解读方式 , 规定了 " 数据包 " 的概念 : 一帧数据就是一个数据包 .
以太网协议是一个局域网协议 .
最原始的通信依靠 MAC 地址 ( 网卡地址 ).
以太网数据包会将数据封装
以太网数据包
{
标头 : 通信双方的 MAC 地址 .
数据 : 需要传递的数据内容 .
}
}
物理层 : 两台电脑如何连接在一起 ?
{
{ 双方的 MAC 地址 { 双方 :IP 地址 { 端口号 : 5001 信息内容 : 我喜欢你 }}}
{ 0101010100100010100010100010101 }
网线 /WIFI( 有线 / 无线 ---> 电信号 ( 高 ( 1 ) 低 ( 0 ) 电平 )) , 规定了网络接口类型
// 1. 物理层负责将电脑连接起来 .
// 2. 物理层负责传递数据 0 和 1.
}
信息在网络中是如何传递的 ?
{
广播 : 在同一个子网络内 , 信息以广播的形式发送 .
路由 : 信息在不同的子网络之间传递 , 就是路由 .
}
{
配置服务器
:
可以上传、分享、测试自己写的app主要的!
1.
终端
.control+空格键搜索
cd /etc/apache2/
进入
apache2
所在的文件目录
;
ls 查看当前文件夹下的文件目录 .
sudo vim httpd.conf sudo 以管理员的权限打开 . vim ( 编辑器打开 )
/DocumentRoot / 是 vim 的查找命令 . /DocumentRoot 查找 DocumentRoot (Web 服务器的 ) 根路径
shift + v ( 选中这一行 )
y 复制这一行
p 在当前行下面粘贴复制那一行 .
# 在 vim 中是 注释的意思 .
i 让 vim 编辑器由 命令行模式 进入 编辑模式
ls 查看当前文件夹下的文件目录 .
sudo vim httpd.conf sudo 以管理员的权限打开 . vim ( 编辑器打开 )
/DocumentRoot / 是 vim 的查找命令 . /DocumentRoot 查找 DocumentRoot (Web 服务器的 ) 根路径
shift + v ( 选中这一行 )
y 复制这一行
p 在当前行下面粘贴复制那一行 .
# 在 vim 中是 注释的意思 .
i 让 vim 编辑器由 命令行模式 进入 编辑模式
esc(电脑键盘上的esc)
让
vim
编辑器由
编辑模式
进入
命令行模式
2.
/Options Follow 查找这一行
在 Options Follow 中间插入 Indexes 让服务器以列表的形式呈现内容 .
( 配置完毕之后的样子 'Options Indexes FollowSymLinks Multiviews' )
3.
/php 查找 php 所在的那一行 .
删除行首的 # 号 .
esc 退出编辑模式 .
:wq 保存并退出 vim 编辑器 .
4. 启动服务器 .
{
1. 启动服务器
sudo apachectl -k restart
sudo apachectl restart
2. 关闭服务器
sudo apachectl -k stop
sudo apachectl stop
如果出现下面的提示 , 说明服务器配置成功 :
AH00558: httpd: Could not reliably determine the server 's fully qualified domain name, using teacherdeiMac.local. Set the ' ServerName ' directive globally to suppress this message
httpd not running, trying to start
}
}
学习点:
{
// 在 mrc 的代码中,没有 weak ,只有 assign
// assign 修饰符号,对对象不做任何操作,只是简单的记录地址
// weak 是 ARC 专有的,如果对象没有其他任何对象做强引用,会被立即释放!
// weak 的效率非常差!
// assign 会记录住地址,对象释放后,地址仍然保留,在 MRC 开发中,野指针错误非常频繁
// weak 安全性很好!一旦没有强引用,自动将地址设置为 nil , OC 中可以向 nil 发送任何消息都不会报错
}
第三天 :get 和 post 区别
// 网络数据缓存
网络缓存数据 , 保存在 SQLite 的数据库中 (NSHomeDirectory()),
// 查看缓存的数据命令行 :
cd 文件目录 ( 打开文件目录 )
ls 查看当前文件下目录
sqlite3 Cache.db 打开数据库
.tables 查看数据库中的表单
select * from cfurl_cache_response; 查看服务器响应缓存
select * from cfurl_cache_receiver_data; 查看服务器返回的数据缓存
URL: 使用注意
< 1 >URL 中 , 所有的字符都必须是 ASCII 码 ;
< 2 >URL 中不能出现中文和特殊符号 ( 如空格 );
所以 , 如果 URL 中出现了中文 , 需要添加百分号转译 .
// GET/POST 登陆 UI 界面的搭建注意 :
iphone6+ 防边缘触摸
移动端应用默认应该记住密码
< 1 > 保存到用户偏好设置
版本管理
git
偏好设置保存用户信息
用户密码不能以明文的形式保存 , 需要对用户密码加密之后再保存 .
加密 :
< 1 > base64 :iOS 7.0 以后 , 苹果提供 base64 的编码解码支持 .
< 2 > MD5
< 1 > 加盐 : 加盐要足够长 , 足够复杂 .
< 2 >HMAC: 一个结合了散列函数的加密算法 ; 给定一个秘钥 , 分别作两次加密和散列 .
< 3 > 用户密码是动态变化的 . --- 时间戳密码
给定相同的加密算法和相同的密码明文 , 要求每次登陆的时候 , 密码都不一样 . 两个密码只要有一个相同就可以了
IP 辅助 / 手机绑定
< 3 > 钥匙串访问 iOS 7.0.3 以后支持 AES 256 加密 是安全的 .
SSKeyChain 是对底层 C 语言的封装 .
如果没有钥匙串访问 , 本地密码的保存会相当的繁琐 , 需要使用 RSA( 秘钥 ) & AES( 加密 & 解密 )
BundleID ------- 应用程序的唯一的标识 , 每一个上架的应用程序 , 都有唯一的 BundleID
获取 BundleID: [NSBundle mainBundle].bundleIdentifier;
< 4 > 指纹识别
指纹识别 : 功能是 5 s 之后推出的 , SDK 是 iOS 8.0 之后推出的 . 同时推出 ApplePay
推出的目的是简化支付 . 移动支付环节越简单越好 .
使用 :
< 1 > 导入头文件
#import <LocalAuthentication/LocalAuthentication.h>
< 2 > 使用
< 3 > 判断系统版本
当前系统版本 : [UIDevice currentDevice].systemVersion.floatValue
第四天 POST 增强
上传单个 / 多个文件
RESTfull 风格设计
JSON 序列化
模型转字典 KVC, 注意跟字典转模型相比较
快捷键 知识点
核心动画
归档解档 KVO
青花瓷 加载网易新闻数据
网络模型数据 , 字典转模型
用运行时 , 字典转模型
第五天 : 下载文件
HEAD 方法 ;
指向指针的指针用法 ;
NULL 和 nil 的区别 .
NSNull 为了能够是数组和字典中使用空值
下载文件
NSFileHandle // 文件句柄
NSOutputStream // 数据流 注意删除存在的文件 , 防止多次下载文件越来越大
断点续传
子线程下载 , 运行循环 .
下载回调 (Block)
核心绘图 , 百分比显示进度条 ( 圆圈 ).
下载缓存池
NSOperation
// 在 mrc 的代码中,没有 weak ,只有 assign
// assign 修饰符号,对对象不做任何操作,只是简单的记录地址
// weak 是 ARC 专有的,如果对象没有其他任何对象做强引用,会被立即释放!
// weak 的效率非常差!
// assign 会记录住地址,对象释放后,地址仍然保留,在 MRC 开发中,野指针错误非常频繁
// weak 安全性很好!一旦没有强引用,自动将地址设置为 nil , OC 中可以向 nil 发送任何消息都不会报错
}
第三天 :get 和 post 区别
// 网络数据缓存
网络缓存数据 , 保存在 SQLite 的数据库中 (NSHomeDirectory()),
// 查看缓存的数据命令行 :
cd 文件目录 ( 打开文件目录 )
ls 查看当前文件下目录
sqlite3 Cache.db 打开数据库
.tables 查看数据库中的表单
select * from cfurl_cache_response; 查看服务器响应缓存
select * from cfurl_cache_receiver_data; 查看服务器返回的数据缓存
URL: 使用注意
< 1 >URL 中 , 所有的字符都必须是 ASCII 码 ;
< 2 >URL 中不能出现中文和特殊符号 ( 如空格 );
所以 , 如果 URL 中出现了中文 , 需要添加百分号转译 .
// GET/POST 登陆 UI 界面的搭建注意 :
iphone6+ 防边缘触摸
移动端应用默认应该记住密码
< 1 > 保存到用户偏好设置
版本管理
git
偏好设置保存用户信息
用户密码不能以明文的形式保存 , 需要对用户密码加密之后再保存 .
加密 :
< 1 > base64 :iOS 7.0 以后 , 苹果提供 base64 的编码解码支持 .
< 2 > MD5
< 1 > 加盐 : 加盐要足够长 , 足够复杂 .
< 2 >HMAC: 一个结合了散列函数的加密算法 ; 给定一个秘钥 , 分别作两次加密和散列 .
< 3 > 用户密码是动态变化的 . --- 时间戳密码
给定相同的加密算法和相同的密码明文 , 要求每次登陆的时候 , 密码都不一样 . 两个密码只要有一个相同就可以了
IP 辅助 / 手机绑定
< 3 > 钥匙串访问 iOS 7.0.3 以后支持 AES 256 加密 是安全的 .
SSKeyChain 是对底层 C 语言的封装 .
如果没有钥匙串访问 , 本地密码的保存会相当的繁琐 , 需要使用 RSA( 秘钥 ) & AES( 加密 & 解密 )
BundleID ------- 应用程序的唯一的标识 , 每一个上架的应用程序 , 都有唯一的 BundleID
获取 BundleID: [NSBundle mainBundle].bundleIdentifier;
< 4 > 指纹识别
指纹识别 : 功能是 5 s 之后推出的 , SDK 是 iOS 8.0 之后推出的 . 同时推出 ApplePay
推出的目的是简化支付 . 移动支付环节越简单越好 .
使用 :
< 1 > 导入头文件
#import <LocalAuthentication/LocalAuthentication.h>
< 2 > 使用
< 3 > 判断系统版本
当前系统版本 : [UIDevice currentDevice].systemVersion.floatValue
第四天 POST 增强
上传单个 / 多个文件
RESTfull 风格设计
JSON 序列化
模型转字典 KVC, 注意跟字典转模型相比较
快捷键 知识点
核心动画
归档解档 KVO
青花瓷 加载网易新闻数据
网络模型数据 , 字典转模型
用运行时 , 字典转模型
第五天 : 下载文件
HEAD 方法 ;
指向指针的指针用法 ;
NULL 和 nil 的区别 .
NSNull 为了能够是数组和字典中使用空值
下载文件
NSFileHandle // 文件句柄
NSOutputStream // 数据流 注意删除存在的文件 , 防止多次下载文件越来越大
断点续传
子线程下载 , 运行循环 .
下载回调 (Block)
核心绘图 , 百分比显示进度条 ( 圆圈 ).
下载缓存池
NSOperation