同步串行队列、异步串行队列和同步并行队列都只创建一个线程,而异步并行队列则创建多个线程。
iOS 知识点整理
iOS App 安全
本地数据安全
- 对于主动存储在app内的重要的、有价值的、涉及隐私的信息需要加密处理,增加攻击者破解难度。
- 对于一些非主动的存储行为如网络缓存,涉及重要信息,做到用完即删。
- Sqlite敏感数据要么对数据加密(优:使用简单,无需三方库支持;缺:每次存储都有加密解密过程,增加APP资源消耗),要么对整库加密(优:对数据库整体操作,减少资源消耗。缺:需要使用第三库),如SQLCipher
- KeyChain数据的读取。Keychain是一个拥有有限访问权限的SQLite数据库(AES256加密),可以为多种应用程序或网络服务存储少量的敏感数据(如用户名、密码、加密密钥等)。可以在越狱的设备上使用keychain_dumper来解密。
- 剪切板的缓存要及时清理
网络请求使用https,防止http劫持或使用httpdns
尽量使用WKWebView代替UIWebView
加大反编译的难度
- 字符串加密
- 类名方法名混淆
- 反调试
防止抓包
- 判断是否设置了代理
- 数据加密
断点续传怎么实现?需要设置什么?
所谓断点续传,就是要从文件已经下载的地方开始继续下载。所以在客户端/浏览器传给Web服务器的时候要多加一条信息–从哪里开始。下面是用自己编的一个”浏览器”来传递请求信息给Web服务器,要求从2000070字节开始。
GET /down.zip HTTP/1.1
User-Agent: NetFox
RANGE: bytes=2000070-
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
仔细看一下就会发现多了一行RANGE: bytes=2000070-这一行的意思就是告诉服务器down.zip这个文件从2000070字节开始传,前面的字节不用传了。服务器收到这个请求以后,返回的信息如下:
206
Content-Length=106786028
Content-Range=bytes 2000070-106786027/106786028
Date=Mon, 30 Apr 2001 12:55:20 GMT
ETag=W/"02ca57e173c11:95b"
Content-Type=application/octet-stream
Server=Microsoft-IIS/5.0
Last-Modified=Mon, 30 Apr 2001 12:55:20 GMT
和前面服务器返回的信息比较一下,就会发现增加了一行:Content-Range=bytes 2000070-106786027/106786028返回的代码也改为206了,而不再是200了。
iOS SnapKit源码解析
iOS布局从Frame到Autosizing,再到Autolayout。Storyboard上使用Autolayout对于层级不深的页面来说比较方便,大大提升了开发速度,但App体积也会增加不少,用代码写Autolayout就不是那么方便了。如
iOS app进入后台毛玻璃效果
直接上代码1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22func applicationDidBecomeActive(_ application: UIApplication) {
if let visualEffectView = self.visualEffectView {
UIView.animate(withDuration: 0.5, animations: {
visualEffectView.alpha = 0
}, completion: { (_) in
visualEffectView.removeFromSuperview()
})
}
}
weak var visualEffectView: UIVisualEffectView?
func applicationWillResignActive(_ application: UIApplication) {
let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.light)
let visualEffectView = UIVisualEffectView(effect: blurEffect)
visualEffectView.alpha = 0
visualEffectView.frame = self.window?.frame ?? CGRect.zero
self.window?.addSubview(visualEffectView)
self.visualEffectView = visualEffectView
UIView.animate(withDuration: 0.5) {
visualEffectView.alpha = 1
}
}
MySQL创建数据库与创建用户以及授权
- create schema [数据库名称] default character set utf8 collate utf8_general_ci;–创建数据库
采用create schema和create database创建数据库的效果一样。 - create user ‘[用户名称]‘@’%’ identified by ‘[用户密码]’;–创建用户
密码8位以上,包括:大写字母、小写字母、数字、特殊字符
%:匹配所有主机,该地方还可以设置成‘localhost’,代表只能本地访问,例如root账户默认为‘localhost‘ - grant select,insert,update,delete,create on [数据库名称]. to [用户名称];–用户授权数据库
代表整个数据库 - flush privileges ;–立即启用修改
- revoke all on . from tester;–取消用户所有数据库(表)的所有权限
- delete from mysql.user where user=’tester’;–删除用户
- drop database [schema名称|数据库名称];–删除数据库
macOS使用OpenSSL生成 RSA公钥与私钥
macOS自带openssl环境,不用安装,直接使用openssl就可以
打开终端,进入到即将生成密钥文件的目录下,然后输入命令:1
2
3
4
5openssl
genrsa -out rsa_private_key.pem #2048生成私钥
pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt -out rsa_private_key_pkcs8.pem #将私钥转换成PKCS8格式
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem #生成公钥
exit #退出
搭建memcached服务器
安装 libevent
1 | tar -zxvf libevent-2.1.8-stable.tar.gz |
安装 memcached
1 | curl http://memcached.org/files/memcached-1.5.1.tar.gz -o memcached-1.5.1.tar.gz |
开放端口
1 | firewall-cmd --zone=public --add-port=11211/tcp --permanent |
搭建redis服务器
安装 EPEL 源
1 | yum install epel-release |
安装C
1 | yum install gcc |
安装Redis
1 | curl http://download.redis.io/releases/redis-4.0.1.tar.gz -o redis-4.0.1.tar.gz |