孙同生的博客

为美好的世界献上祝福

AFURLSessionManager 和 AFHTTPSessionManager 是AFNetworking的核心类
这里先阅读AFURLSessionManager。

使用 AFURLSessionManager 创建下载任务

1
2
3
4
5
6
7
8
9
10
11
12
13
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];

NSURL *URL = [NSURL URLWithString:@"http://example.com/download.zip"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];

NSURLSessionDownloadTask *downloadTask = [manager downloadTaskWithRequest:request progress:nil destination:^NSURL *(NSURL *targetPath, NSURLResponse *response) {
NSURL *documentsDirectoryURL = [[NSFileManager defaultManager] URLForDirectory:NSDocumentDirectory inDomain:NSUserDomainMask appropriateForURL:nil create:NO error:nil];
return [documentsDirectoryURL URLByAppendingPathComponent:[response suggestedFilename]];
} completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error) {
NSLog(@"File downloaded to: %@", filePath);
}];
[downloadTask resume];
阅读全文 »

AFNetworking3源码阅读-Security
自 iOS9 发布之后,由于新特性 App Transport Security 的引入,在默认行为下是不能发送 HTTP 请求的。很多网站都在转用 HTTPS,而 AFNetworking 中的 AFSecurityPolicy 就是为了阻止中间人攻击,以及其它漏洞的工具。
AFSecurityPolicy 主要作用就是验证 HTTPS 请求的证书是否有效,如果 app 中有一些敏感信息或者涉及交易信息,一定要使用 HTTPS 来保证交易或者用户信息的安全。

https & SSL Pinning

https

HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密

SSL Pinning

可 以理解为证书绑定,是指客户端直接保存服务端的证书,建立https连接时直接对比服务端返回的和客户端保存的两个证书是否一样,一样就表明证书 是真的,不再去系统的信任证书机构里寻找验证。这适用于非浏览器应用,因为浏览器跟很多未知服务端打交道,无法把每个服务端的证书都保存到本地,但CS架构的像手机APP事先已经知道要进行通信的服务端,可以直接在客户端保存这个服务端的证书用于校验。

为什么直接对比就能保证证书没问题? 如果中间人从客户端取出证书,再伪装成服务端跟其他客户端通信,它发送给客户端的这个证书不就能通过验证吗?确实可以通过验证,但后续的流程走不下去,因为下一步客户端会用证书里的公钥加密,中间人没有这个证书的私钥就解不出内容,也就截获不到数据,这个证书的私钥只有真正的服务端有,中间人伪造证书主要伪造的是公钥。

为什么要用SSL Pinning?正常的验证方式不够吗?如果服务端的证书是从受信任的的CA机构颁发的,验证是没问题的,但CA机构颁发证书比较昂贵,小企业或个人用 户 可能会选择自己颁发证书,这样就无法通过系统受信任的CA机构列表验证这个证书的真伪了,所以需要SSL Pinning这样的方式去验证。

阅读全文 »

AFNetworking3源码阅读-Reachability

用于监控网络状态。当网络状态改变时,是重新发起一些请求的好时间;网络状态的监控也能给用户更好的网络失败提示。

AFNetworkReachabilityManager

使用

1
2
3
4
5
[[AFNetworkReachabilityManager sharedManager] setReachabilityStatusChangeBlock:^(AFNetworkReachabilityStatus status) {
NSLog(@"Reachability: %@", AFStringFromNetworkReachabilityStatus(status));
}];

[[AFNetworkReachabilityManager sharedManager] startMonitoring];
阅读全文 »

AVFoundation可以识别一维条码和二维码

一维条码支持的类型有:UPC-E EAN-8 EAN-13 Code 39 Code 93 Code 128 交错式2of5码(iOS8以上) ITF (iOS8以上);

二维码支持的类型有: QR Axtec PDF-417 Data matrix(iOS8以上)

同样使用AVCaptureMetadataOutput ,和实现AVCaptureMetadataOutputObjectsDelegate代理

阅读全文 »

AVAssetReader 和 AVAssetWriter类提供的低级功能,能处理更复杂的媒体样本。

AVAssetReader 和 AVAssetWriter

AVAssetReader

AVAssetReader 用于从 AVAsset示例中读取媒体样本。

通常会配置一个或多个AVAssetReaderOutput实例,并通过 copyNextSampleBuffer 方法访问音频和视频帧。

一个资源读取器的内部通道都是以多线程的方式不断提取下一个可用样本的。这样可以在系统请求资源时最小化时延。

阅读全文 »

之前在 AVFoundation拍照和录像 中使用 AVCaptureMovieFileOutput类来捕捉 QuickTime影片,这个类定义了捕捉视频数据的简单方法。当对捕捉到的视频数据进行更底层的操作时,就需要用到 AVCaptureVideoDataOutput

AVCaptureVideoDataOutputSampleBufferDelegate

与AVCaptureMovieFileOutput的委托回调不同,AVCaptureVideoDataOutput的委托回调为AVCaptureVideoDataOutputSampleBufferDelegate

它定义了一下两个方法:

  • - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection;
    • 每当有一个视频帧写入该方法就会被调用
  • - (void)captureOutput:(AVCaptureOutput *)captureOutput didDropSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection NS_AVAILABLE(10_7, 6_0);
    • 每当一个迟到的视频帧被丢弃时,就会被调用。通常是因为 在didOutputSampleBuffer中调用了耗时的操作。

CMSampleBufferRef

CMSampleBufferRef将基本的样本数据进行封装并提供格式和时间信息,还会家伙是哪个所有在转换和处理数据时用到的元数据。

阅读全文 »

以高帧率(FPS)捕捉视频内容带来很多好处

AVCaptureDeviceFormat实例具有 videoSupportedFrameRateRanges 属性,它包含一个AVFrameRateRange对象数组,其中带有格式所支持的最小帧率、最大帧率和时长信息。

确定是否支持高帧率

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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
@implementation AVCaptureDevice (THAdditions)

//是否支持高帧率
- (BOOL)supportsHighFrameRateCapture {
if (![self hasMediaType:AVMediaTypeVideo]) { // 1
return NO;
}
return [self findHighestQualityOfService].isHighFrameRate; // 2
}

//查找设备所支持的帧率等信息
- (THQualityOfService *)findHighestQualityOfService {

AVCaptureDeviceFormat *maxFormat = nil;
AVFrameRateRange *maxFrameRateRange = nil;

for (AVCaptureDeviceFormat *format in self.formats) {

FourCharCode codecType = // 3
CMVideoFormatDescriptionGetCodecType(format.formatDescription);

if (codecType == kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange) { // 4

NSArray *frameRateRanges = format.videoSupportedFrameRateRanges;

for (AVFrameRateRange *range in frameRateRanges) { // 5
if (range.maxFrameRate > maxFrameRateRange.maxFrameRate) {
maxFormat = format;
maxFrameRateRange = range;
}
}
}
}

return [THQualityOfService qosWithFormat:maxFormat // 6
frameRateRange:maxFrameRateRange];

}
//开启高帧率
- (BOOL)enableMaxFrameRateCapture:(NSError **)error {

THQualityOfService *qos = [self findHighestQualityOfService];

if (!qos.isHighFrameRate) { // 1
if (error) {
NSString *message = @"Device does not support high FPS capture";
NSDictionary *userInfo = @{NSLocalizedDescriptionKey : message};

NSUInteger code = THCameraErrorHighFrameRateCaptureNotSupported;

*error = [NSError errorWithDomain:THCameraErrorDomain
code:code
userInfo:userInfo];
}
return NO;
}


if ([self lockForConfiguration:error]) { // 2

CMTime minFrameDuration = qos.frameRateRange.minFrameDuration;

self.activeFormat = qos.format; // 3
self.activeVideoMinFrameDuration = minFrameDuration; // 4
self.activeVideoMaxFrameDuration = minFrameDuration;

[self unlockForConfiguration];
return YES;
}
return NO;
}


@end
阅读全文 »

Core Image框架中定义了CIDetector和CUFaceFeature,它们使用起来提供了简单而强大的人脸检测功能
但是这些方法没有针对实时性进行优化,在AVFoundation中通过特定的AVCaptureOutput类型的 AVCaptureMetadataOutput也可以实现人脸检测。

当使用人脸检测时,会输出一个具体子类类型AVMetadataFaceObject。AVMetadataFaceObject 定义了多个用户描述被检测到的人脸的属性,最重要的是人脸的边界(bounds),还给出了用于定义检测人脸倾斜角(roll angle)表示人的头部向肩膀方向侧倾角度,偏转角(yaw angle)表示人脸绕y轴旋转的角度。

配置会话与之前使用摄像头拍照类似,区别在于更换一个output,如:

阅读全文 »

iOS7以前使用AVCaptureConnection

通过 AVCaptureConnection 的属性对摄像头缩放进行有限制的支持,开发者可以通过调整连接缩放的值从默认的1.0增加到 videoMaxScaleAndCropFactor 属性定义的最大值

需要用到AVCaptureConnection的两个属性

  • @property(nonatomic) CGFloat videoScaleAndCropFactor
  • @property(nonatomic, readonly) CGFloat videoMaxScaleAndCropFactor

videoScaleAndCropFactor这个属性取值范围是1.0-videoMaxScaleAndCropFactor

阅读全文 »

使用AV Foundation 捕捉照片和视频

使用AVFoundation拍照和录制视频的一般步骤如下:

  1. 创建AVCaptureSession对象。
  2. 使用AVCaptureDevice的静态方法获得需要使用的设备,例如拍照和录像就需要获得摄像头设备,录音就要获得麦克风设备。
  3. 利用输入设备AVCaptureDevice初始化AVCaptureDeviceInput对象。
  4. 初始化输出数据管理对象,如果要拍照就初始化AVCaptureStillImageOutput对象;如果拍摄视频就初始化AVCaptureMovieFileOutput对象。
  5. 将数据输入对象AVCaptureDeviceInput、数据输出对象AVCaptureOutput添加到媒体会话管理对象AVCaptureSession中。
  6. 创建视频预览图层AVCaptureVideoPreviewLayer并指定媒体会话,添加图层到显示容器中,调用AVCaptureSession的startRuning方法开始捕获。
  7. 将捕获的音频或视频数据输出到指定文件。
阅读全文 »
0%