iOS下载视频思路

网络

  • 采用MKNetworkKit库
  • 网络下载代码封装
1
2
3
4
5
6
7
8
9
10
11
12
13
MKNetworkOperation *operation = [[MKNetworkOperation alloc] initWithURLString:@"http://mr3.douban.com/201508152125/c7afbeeb3248c382aac7811330bb898c/view/song/small/p1469094_128k.mp4" params:nil httpMethod:@"Get"];
[operation addHeader:@"Range" withValue:[NSString stringWithFormat:@"bytes=%llu-", [self _getCacheFileSize:[self _savePath]]]];
[operation addDownloadStream:[NSOutputStream outputStreamToFileAtPath:[self _savePath] append:YES]];
__weak __typeof(self) weakSelf = self;
[operation onDownloadProgressChanged:^(double progress) {
NSLog(@"%.2f", progress);
[weakSelf.progressBtn setTitle:[NSString stringWithFormat:@"%.f%%", progress * 100] forState:UIControlStateNormal];
[weakSelf.progressBtn setProgress:progress];
if (progress == 1) {
weakSelf.progressBtn.userInteractionEnabled = NO;
}
}];

[operation addHeader:@"Range" withValue:[NSString stringWithFormat:@"bytes=%llu-", [self _getCacheFileSize:[self _savePath]]]];添加Range头部,获取已下载的文件的字节,断点续传

[operation addDownloadStream:[NSOutputStream outputStreamToFileAtPath:[self _savePath] append:YES]];字节流输出到_savePath路径,append:YES在字节尾部添加

[operation onDownloadProgressChanged:^(double progress) { NSLog(@"%.2f", progress); }];下载进度更新block,可以在block里面更新UI

进度条UI

  • 封装CircularProgressButton

画圆方法

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
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
//draw background circle
UIBezierPath *backCircle = [UIBezierPath bezierPathWithArcCenter:CGPointMake(CGRectGetWidth(self.bounds) / 2, CGRectGetHeight(self.bounds) / 2)
radius:(CGRectGetWidth(self.bounds) - self.lineWidth ) / 2
startAngle:(CGFloat) - M_PI_2
endAngle:(CGFloat)(1.5 * M_PI)
clockwise:YES];
[self.backColor setStroke];
backCircle.lineWidth = self.lineWidth;
[backCircle stroke];
if (self.progress) {
//draw progress circle
UIBezierPath *progressCircle = [UIBezierPath bezierPathWithArcCenter:CGPointMake(CGRectGetWidth(self.bounds) / 2,CGRectGetHeight(self.bounds) / 2)
radius:(CGRectGetWidth(self.bounds) - self.lineWidth ) / 2
startAngle:(CGFloat) - M_PI_2
endAngle:(CGFloat)(- M_PI_2 + self.progress * 2 * M_PI)
clockwise:YES];
[self.progressColor setStroke];
progressCircle.lineWidth = self.lineWidth;
[progressCircle stroke];
}
}

更新进度

1
2
3
4
5
6
7
8
9
- (void)setProgress:(float)progress
{
_progress = progress;
[self setNeedsDisplay];
[self setNeedsLayout];
if (self.delegate && [self.delegate respondsToSelector:@selector(updateProgressViewWithProgress:)]) {
[self.delegate updateProgressViewWithProgress:self.progress];
}
}

初始化方法

1
2
3
4
5
6
7
8
9
10
11
12
13
- (id)initWithFrame:(CGRect)frame
backGressColor:(UIColor *)backColor
progressColor:(UIColor *)progressColor
lineWidth:(CGFloat)lineWidth
{
self = [super initWithFrame:frame];
if (self) {
_progressColor = progressColor;
_lineWidth = lineWidth;
_backColor = backColor;
}
return self;
}
  • 使用进度条
1
2
3
4
5
6
7
8
9
10
11
CircularProgressButton *progressBtn = [[CircularProgressButton alloc] initWithFrame:CGRectMake(50, 100, 100, 100)
backGressColor:[UIColor grayColor]
progressColor:[UIColor greenColor]
lineWidth:5.f];
[progressBtn setTitleColor:[UIColor brownColor] forState:UIControlStateNormal];
[progressBtn setTitle:[NSString stringWithFormat:@"%.f%%", 0.0 * 100] forState:UIControlStateNormal];
progressBtn.selected = NO;
[self.view addSubview:progressBtn];
self.progressBtn = progressBtn;
[progressBtn addTarget:self action:@selector(_downloadAction:) forControlEvents:UIControlEventTouchUpInside];

源代码

https://github.com/jackyshan/iOSHttpDownloadProgress