前言

最近在公司写了个小程序来为iOS应用中的图片瘦身,进而减小APP大小,减少用户下载时的流量。

瘦身是在一个专门为图片瘦身的网站进行的。

地址:https://tinypng.com

这个网站提供的接口是基于https协议的,之前没有怎么用过https协议,现在一并总结一下。

关于HTTPS

https协议基础请参考参考:

HTTPS的七个误解

其实HTTPS就是安全版本的http协议,

他采用了RSA非对称加密公私钥对,使用SSL证书验证保证了用户数据在传输时的安全行。

下面简单看一下http和https请求过程的异同

我们按个看下流程

1.客户端向服务端发送基于https的请求。

2.服务端创建公私钥对。

3.服务端把共钥绑定在证书上面返回给客户端。

4.客户端验证证书是否可靠(验证方式有两种,分别针对CA机构办法的证书和自己创建的证书:1.是向颁发证书的CA机构发送请求来验证。2.是在客户端保存一个证书副本,来对比两个证书,同时还会验证是否被中间人进行了攻击,验证方式就是用证书的pubkey去解证书的上密文,如果和证书上的明文一直就可以确定没有被攻击)。

5.客户端生成一个随机数并用公钥加密传递给服务器。

6.服务器用私钥解密得到随机数,根据随机数产生对称加密秘钥并用私钥对秘钥进行加密。

7.传递对称秘钥给客户端。

8.客户端用公钥解密得到对称加密秘钥。

以后的通信就会使用对称加密的秘钥来进行了,所以https其实也就第一次请求会比较慢,因为要生成通信对称秘钥,以后再进行通信就和http不会差很多了。

iOS对于HTTPS的支持

在说这点之前,先说说tinypng这个网站的接口。

注册新用户后会返回给你一串key,我们要针对这串key做https请求

该站采用的是HTTP Basic Auth认证方式(关于Basic Auth认证方式详情参看维基百科)。

所以我们做请求的时候就需要使用添加headerfield。

返回的时候会把我们上传图片处理后的下载路径传回来,比较奇葩的是,路径并不在响应体而是在响应头中的Location字段内...(难道图片就不需要保密了么...)。

下面说说iOS该怎么做,

iOS的NSURLConnection和NSURLSession的API都提供了很方便的API来支持https请求。

我在实际操作的时候使用的是NSURLConnection。

首先创建请求:

 NSURL *url = [NSURL URLWithString:REQUEST_URL];

 NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

 NSString *basicAuthUsername = BASIC_AUTH_USERNAME;
NSString *basicAuthPassword = BASIC_AUTH_PASSWORD;
NSData *authorizationData = [[NSString stringWithFormat:@"%@:%@",basicAuthUsername,basicAuthPassword] dataUsingEncoding:NSASCIIStringEncoding];
NSString *authorizationStr = [NSString stringWithFormat:@"Basic %@",[authorizationData base64EncodedStringWithOptions:]];
NSLog(@"%@",authorizationStr);
[request setHTTPMethod:@"POST"];
[request addValue:authorizationStr forHTTPHeaderField:@"Authorization"];
[request addValue:@"*/*" forHTTPHeaderField:@"Accept"];

URL在API中提供的有,只是协议我们写为HTTPS,然后进行Authorization头字段的拼接,实际上就是Basic base64(用户名:密码)。

Accept这里设置为了*/*,其实如果知道服务器返回类型可以直接指定application/json或者text/json之类的就行。

下面看看连接:

 -(BOOL)connection:(NSURLConnection*)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace*)protectionSpace
{
return[protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust];
} -(void)connection:(NSURLConnection*)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge*)challenge
{
[challenge.sender continueWithoutCredentialForAuthenticationChallenge:challenge];
}

我们需要实现NSURLConnectionDelegate,然后实现上面的两个方法。

第一个方法是判断需要响应哪一类的安全问题,

  NSString *NSURLAuthenticationMethodDefault;

  NSString*NSURLAuthenticationMethodHTTPBasic;

  NSString*NSURLAuthenticationMethodHTTPDigest;

  NSString*NSURLAuthenticationMethodHTMLForm;

  NSString*NSURLAuthenticationMethodNegotiate;

  NSString*NSURLAuthenticationMethodNTLM;

  NSString*NSURLAuthenticationMethodClientCertificate;

  NSString*NSURLAuthenticationMethodServerTrust;

可以响应的安全问题有很多,这里我们只响应HTTPS相关的就行,因此选择NSURLAuthenticationMethodServerTrust。

第二个方法是处理验证结果的,这里我这样写会直接忽略证书验证,这里我们可以处理证书的验证策略逻辑。

我们start connection后就会发现可以成功的调用接口了。

关于一些其他细节

写这个小玩意还是用到了一些没有接触过的东西的。

下面总结一下。

1.文件实例类NSFileHandle,这个类可以拿到文件实例,比如我们想去控制文件读写细节就需要用到这个类,这里使用是为了保存没有成功请求的图片名称。

2.connection的异步请求做的非常好了,使用多线程请求,具体的请求线程个数由系统来判断。

3.多线程读写文件使用dispatch_barrier_async方法避免资源竞争。

不足

1.写的时候是所有上传请求全部结束后才开始下载的,这样效率很低,可以修改为成功上传后就直接下载不用等待其他的文件上传,不过这样多线程处理会稍微麻烦一些。

iOS图片瘦身总结的更多相关文章

  1. iOS代码瘦身实践

    1 分析当前ipa的组成 一般一个ipa会包含: 1) 资源文件 本地文件:数据.配置.数据库等等 字体文件 图片资源 2)  源代码 通过生成linkmap文件,分析源代码生成的编译文件的大小.在B ...

  2. Python在七牛云平台的应用(二)图片瘦身

    (一)七牛云平台的图片瘦身功能简介:(引用自官网) 针对jpeg.png格式图片 瘦身后分辨率不变,格式不变. 肉眼画质不变. 图片体积大幅减少,节省 CDN 流量 官网给的图片压缩率很高,官网给的「 ...

  3. 让你的 CDN 费用省 50% 以上!图片瘦身的正确姿势

    七牛云新推出的图片瘦身功能是做什么的? 打开七牛云的「数据处理」中的「图片瘦身」功能,在图片受到访问时,能够实时对图片进行瘦身,在保证分辨率和画质不变的情况下,可以将图片最高缩小 80%.当「图片瘦身 ...

  4. iOS内置图片瘦身思路整理

    一.前言 前段时间注意到我们APP的包大小超过100MB了,所以随口跟老板说了下能否采用字体文件(.ttf)替代PNG图片,老板对应用瘦身很感兴趣因此让我做下技术调研.这篇文章主要是将我们的各个技术方 ...

  5. iOS 内置图片瘦身

    一.iOS 内置资源的集中方式 1.1 将图片存放在 bundle 这是一种很常见的方式,项目中各类文件分类放在各个 bundle 下,项目既整洁又能达到隔离资源的目的.采用 bundle 的加载方式 ...

  6. iOS可执行文件瘦身方法

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  7. 【转】iOS可执行文件瘦身方法

    http://blog.cnbang.net/tech/2544/ 缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我 ...

  8. iOS App 瘦身方案

    缩减iOS安装包大小是很多中大型APP都要做的事,一般首先会对资源文件下手,压缩图片/音频,去除不必要的资源.这些资源优化做完后,我们还可以尝试对可执行文件进行瘦身,项目越大,可执行文件占用的体积越大 ...

  9. iOS控制器瘦身-面向超类编程

    今天写这篇文章的目的,是提供一种思路,来帮助大家解决控制器非常臃肿的问题,对控制器瘦身. 滴滴 老司机要开车了 如果手边有项目,不妨打开工程看一下你的控制器代码有多少行,是不是非常多?再看一下tabl ...

随机推荐

  1. 在Eclipse中设置Maven插件

    [步骤] Maven插件的设置: ①installations:指定Maven核心程序的位置.不建议使用Maven插件自带的Maven程序,而应该使用我们自己解压的那个. ②user settings ...

  2. Java基础学习总结(77)——Java枚举再总结

    在Java SE5之前,我们要使用枚举类型时,通常会使用static final 定义一组int常量来标识,代码如下 public static final int MAN = 0; public s ...

  3. Cow Sorting POJ 3270 & HDU 2838

    题目网址:http://poj.org/problem?id=3270 题目大意是:一串无序的数字,要排成增序的数列,可以交换不相邻的数,每交换两个数,sum+这两个数,使得sum最小,求最小的sum ...

  4. HDU 1018 阶乘数的位数

    题目大意: 将一个数开阶乘后得到的值,来求这个值的位数 n! = 1*2*3*4...*n 对于求一个数的位数的方法为ans = lg(n!) + 1 那么就可以看作 ans = lg(1) + lg ...

  5. 最接近的点配对(分治问题理解) && HDU 1007代码

    题目大意: 给定一堆点集,在这一堆点集中找到一组点集它们之间的距离达到最短 对于HDU1007因为求圆的半径,所以距离还要除以2 普通情况下,可以将nge点,将任意两个点之间的距离都算一遍,在循环过程 ...

  6. [K/3Cloud]DBServiceHelper.ExecuteDataSet(this.Context, sql)) 返回数据问题

    例如下面代码: int sQty = 0; string sql = string.Format(@" Select FMATERIALID ,FBASEUNITID ,FAUXPROPID ...

  7. Python基础--基本文件操作

    全部的编程语言都一样,学完了一些自带的数据机构后,就要操作文件了. 文件操作才是实战中的王道. 所以,今天就来分享一下Python中关于文件的一些基本操作. open方法 文件模式 这个模式对于写入文 ...

  8. linux中man手冊的高级使用方法

    Linux提供了丰富的帮助手冊.当你须要查看某个命令的參数时不必到处上网查找.仅仅要man一下就可以. Linux 的man手冊共同拥有下面几个章节: 1.Standard commands (标准命 ...

  9. [PsTools]psexec.exe使用范例-运行远程电脑程序(exe、bat等)

    前置条件 先下载psexec.exe.放置到C盘根文件夹 下载地址:http://download.csdn.net/detail/whylaughing/8885893 命令范例:(注意空格) C: ...

  10. Apache配置基于域名的虚拟主机

    一.设定 模拟域名  www.wang.org.blog.wang.org.bbs.wang.org 网站文件夹 /var/html/www./var/html/blog./var/html/bbs ...