HTTPS HyperText Transfer Protocol,超文本传输协议,是互联网上使用最广泛的一种协议。HTTP协议传输的数据都是未加密的,也就是明文的,不适合用来传输隐私信息。默认 80 端口。
Hyper Text Transfer Protocol over Secure Socket Layer,安全的超文本传输协议,网景公式设计了 SSL(Secure Sockets Layer) 协议用于对 Http 协议传输的数据进行加密,保证会话过程中的安全性。默认 443 端口。
SSL 包含对称加密和非对称加密,在建立传输链路时,SSL 首先使用非对称加密的方式对对称加密密钥进行加密,建立链路后,使用对称加密的方式对传输内容进行加密。非对称加密有更高的安全性,在这个基础上使用对称加密可以获得更快的速度,提高传输效率。
单向认证 客户端校验服务端证书
client hello 客户端发起一条到服务端的连接,包含客户端支持的 TLS 版本、支持的加密套件(即加密算法)以及客户端随机数。
server hello 服务端回应,包含服务端 SSL 证书、选择的加密套件以及服务端随机数。
authentication 客户端向颁发证书的 CA 验证服务端的 SSL 证书,以确认服务端是它声称的那个身份,从而保证客户端与域名真正的所有者通信。
send premaster key 客户端发送另一个随机数 “premaster key”,并对它使用服务端的公钥(从服务端 SSL 证书中获取得到)进行加密。
decrypt premaster key 服务端解密 premaster key
create session key 客户端和服务端各自使用客户端随机数、服务端随机数以及 premaster key 来计算 “session key”,即对称加密密钥,两边计算得出同样的结果并各自保留。
国内 DCloud 团队推出的 HTML5+ 技术框架可以用来开发 Hybrid 应用。经过调研,我们决定试一试 。框架的核心原理是使用 iOS 系统原生 UIWebView 和 WKWebView 来加载资源并渲染界面,Native 的能力(如拍照、蓝牙)通过自定义插件来提供。
我们的应用有个需求,就是在 webview 加载完页面或者加载页面之前加入一些东西。比如:加载完页面后,根据 HTML 的 title 标签来设置导航栏标题。
原生想要插手页面加载周期,只能靠代理方法。但是因为没法修改源码,所以只能找其它办法。主要思路是:使用 Method Swizzle 找出代理对象然后再换掉代理方法实现。
以 UIWebView 为例,具体操作如下:
第一步,通过交换 setDelegate 的实现,找到目标代理对象所属的类;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 UIWebView+Intercepter.
iOS 10 开始对隐私权限更加严格, 如需使用隐私权限需要在工程的 info.plist 文件中声明,如果不声明程序在调用隐私权限(如相机)时应用程序会崩溃。
key 可以从下拉列表选择,value 为弹框提示文字(类型 String)
权限名称 Key 值 通讯录 NSContactsUsageDescription 麦克风 NSMicrophoneUsageDescription 相册 NSPhotoLibraryUsageDescription 相机 NSCameraUsageDescription 持续获取地理位置 NSLocationAlwaysUsageDescription 使用时获取地理位置 NSLocationWhenInUseUsageDescription 蓝牙 NSBluetoothPeripheralUsageDescription 语音转文字 NSSpeechRecognitionUsageDescription 日历 NSCalendarsUsageDescription
GCD(Grand Central Dispatch)是异步执行任务的技术之一。
一般将应用程序中记述的线程管理用的代码在系统级中实现。开发者只需要定义想执行的任务并追加到适当的 Dispatch Queue 中,GCD 就能生成必要的线程并计划执行任务。由于线程管理是作为系统的一部分来实现的,因此可统一管理,也可执行任务,这样就比以前的线程更有效率。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 dispatch_queue_t queue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); dispatch_async(queue, ^{ /** * 长时间处理 * 例如:AR用图像识别、数据库访问 */ /** * 长时间处理结束,主线程使用该处理结果 */ dispatch_async(dispatch_get_main_queue(), ^{ /** * 只在主线程可以执行的处理 * 例如用户界面刷新 */ }); }); 在导入 GCD 之前,Cocoa 框架提供了 NSObject 类的performSelectorInBackground:withObject实例方法和performSelectorOnMainThread实例方法等简单的多线程编程技术。
线程
线程是程序中一个单一的顺序控制流程。进程内一个相对独立的、可调度的执行单元,是系统独立调度和分派 CPU 的基本单位。在单个程序中同时运行多个线程完成不同的工作,称为多线程。 “一个 CPU 执行的 CPU 命令列为一条无分叉路径”即为“线程”。 现在一个物理的 CPU 芯片实际上有64个(64核)CPU,尽管如此,“一个 CPU 执行的 CPU 命令列为一条无分叉路径”仍然不变。 OS X 和 iOS 的核心 XNU 内核在发生操作系统事件时(如每隔一定时间,唤起系统调用等情况)会切换执行路径。执行中路径的状态,例如CPU的寄存器等信息保存到各自路径专用的内存块中,从切换目标路径专用的内存块中,复原 CPU 寄存器等信息,继续执行切换路径的 CPU 命令列。这称为“上下文切换”。 由于使用多线程的程序可以在某个线程和其他线程之间反复多次进行上下文切换,因此看上去好像1个 CPU 核能够并列地执行多个线程一样。而且在具有多个 CPU 核的情况下,就不是“看上去像”了,而是真的提供了多个CPU核并行执行多个线程的技术。 使用多线程容易引发的常见问题
视图需要有确定的位置与大小才能正确显示在屏幕上。Auto Layout 使用对齐矩阵来确定视图的位置与大小,也就是所谓的约束。我们创建的每一条规则都规定了界面的一部分与另一部分的关系,某一部分可以由另一部分计算得出结果。
y = ax + b; 是一种线性关系。
创建约束的常见的方式:
Xib NSLayoutConstraint VFS 第一种,可以在(Interface Builder)IB中布局约束,并且根据需求自定义它们。
第二种,可以使用代码创建单个约束。NSLayoutConstraint 类提供constraintWithItem:attribute:relatedBy:toItem:attribute:multiplier:contant:方法,可以让你每次创建一个约束,它将某项的属性关联到另一项。
第三种,使用可视化格式语言来表示各项是如何沿着垂直和水平坐标轴布局的。
所有约束都是 NSLayoutConstraint 类的成员,无论你是以何种方式创建它们的。每个约束都在一个 Objective—C 对象中存储y = ax + b规则,并且通过 Auto Layout 引擎来表达该规则。可视化约束 是另一种实现相同效果的工具。
什么是自动引用计数 自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术。要使用 ARC,需要满足以下条件:
使用 Xcode4.2 或以上版本 使用 LLVM 编译器 3.0 或以上版本 编译器选项中设置 ARC 有效 生活例子:办公室开关灯
最早进入办公室的人开灯。 count = 1 之后进入办公室的人,需要照明。 count = 2 下班离开办公室的人,不需要照明。 count = 1 最后离开办公室的人关灯。(此时已无人需要照明) count = 0 内存管理 思考方式:
自己生成的对象,自己持有 非自己生成的对象,自己也能持有 不再需要自己持有的对象时释放 非自己持有的对象无法释放 表 1- 2 对象操作与 Objective-C 方法的对应
对象操作 Objective-C方法 生成并持有对象 alloc/new/copy/mutableCopy方法 持有对象 retain方法 释放对象 release方法 废弃对象 dealloc方法 区域(zone)