Objective c 如何在网络出现故障时使用MKNetworkKit恢复下载

Objective c 如何在网络出现故障时使用MKNetworkKit恢复下载,objective-c,ios,mknetworkkit,Objective C,Ios,Mknetworkkit,据称,MKNetworkKit支持恢复中断的下载,但目前尚不清楚该如何处理。在另一个线程中,它的开发人员说,如果服务器发送范围头,它就可以工作 但是,据我所知,发送范围头的是客户机。我希望库看到下载了多少,然后请求适当的范围。我看不到代码中有任何地方可以这样做 方法 - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 确实检查是否指定了范围,但似乎没有代码实际执行指定 有人让MKNe

据称,MKNetworkKit支持恢复中断的下载,但目前尚不清楚该如何处理。在另一个线程中,它的开发人员说,如果服务器发送范围头,它就可以工作

但是,据我所知,发送范围头的是客户机。我希望库看到下载了多少,然后请求适当的范围。我看不到代码中有任何地方可以这样做

方法

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
确实检查是否指定了范围,但似乎没有代码实际执行指定


有人让MKNetworkKit在网络故障后恢复下载吗?

除了freezable选项(据我所知,该选项不适用于GET)之外,标准MKNetworkKit中没有恢复下载的方法。但是,稍微修改一下,您就可以恢复已被停止的下载

beginBackgroundTaskWithExpirationHandler

或者

操作失败

它需要将downloadedDataSize保存到另一个属性(如resumeDownloadedDataSize),并通过通知(如

NSDictionary *resumeDownloadedDataSizeDetails = [[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithLong:self.resumeDownloadedDataSize], @"resumeDownloadedDataSize", nil];
[[NSNotificationCenter defaultCenter] postNotificationName:kMKNetworkOperationEndBackgroundTaskWithExpirationHandler object:self userInfo:resumeDownloadedDataSizeDetails];
(在MkNetworkKit.h中使用ExpirationHandler定义KMKNetworkOperationAndBackgroundTask)

将resumeDownloadedDataSize设置为0,操作将在没有错误或中断的情况下完成,并在要继续时使其等于downloadDataSize

然后加上

if (self.resumeDownloadedDataSize !=0) {

            NSString* range = @"bytes=";
            range = [range stringByAppendingString:[[NSNumber numberWithLong:self.resumeDownloadedDataSize] stringValue]];
            range = [range stringByAppendingString:@"-"];

            [[self request] setValue:range forHTTPHeaderField:@"Range"];
}

此代码位于

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {

    if (self.downloadedDataSize == 0) {
        // This is the first batch of data
        // Check for a range header and make changes as neccesary
        NSString *rangeString = [[self request] valueForHTTPHeaderField:@"Range"];
        if ([rangeString hasPrefix:@"bytes="] && [rangeString hasSuffix:@"-"]) {
            NSString *bytesText = [rangeString substringWithRange:NSMakeRange(6, [rangeString length] - 7)];
            self.startPosition = [bytesText integerValue];
            self.downloadedDataSize = self.startPosition;
        }
    }  
现在适用于我添加的偏移量,因为客户端请求了一个范围

我还补充说

@property (assign, nonatomic) NSUInteger resumeDownloadedDataSize;
添加到头文件,以便从其他视图进行设置

现在,在调用对象中,您可以侦听通知

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didMKNetworkOperationEndBackgroundTaskWithExpirationHandler:) name:kMKNetworkOperationEndBackgroundTaskWithExpirationHandler object:nil]; 
检查是否适合您,然后重新启动设置范围的操作

- (void) didMKNetworkOperationEndBackgroundTaskWithExpirationHandler: (NSNotification*) notification
{
    if ([[notification object] isEqual:downloadOperation]) {
        resumeDownloadedDataSize = [notification.userInfo objectForKey:@"resumeDownloadedDataSize"];
        bDownloadOperationCancelled=YES;
    }
}
当我使用它下载大文件时,过期处理程序将过期,当我回到前台时,我将重新启动操作

if (bDownloadOperationCancelled) {
        NSLogDebug(@"DownloadOperationCancelled restarted");
        [self doFileDownload];
        bDownloadOperationCancelled=NO;
}
在哪里

- (void) doFileDownload
{
    downloadOperation = [ApplicationDelegate.downloadEngine downloadVideoFile:authDownloadURLString toFile:downloadPath withOffset:resumeDownloadedDataSize];
(Your code for handling completion blocks etc)
…

}
最后一点是确保在引擎中设置“附加到是”

[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];
因此,简历会添加到文件中

还需要说明的是,我使用的是AWS CloudFront,当数据存储在S3中时,它支持使用范围头


这似乎对我有用。我相信还有更优雅的方式

只是更新我自己的答案。随后,我发现这显示了如何检查服务器是否能够遵守HTTP范围标头。
[op addDownloadStream:[NSOutputStream outputStreamToFileAtPath:filePath append:YES]];