ダウンロードするファイルの URL を取得する API があります。NSURLConnection
ファイルのダウンロードに使用しています。MP4なのでファイルサイズが少し大きいかもしれません。
コードステップ:
ダウンロードを再開したいバイトインデックスを初期化
NSMutableURLRequest
して追加します。HttpHeaderField
(インターネット接続が失われる可能性があるため、これを行います)。で初期化
NSURLConnection
されNSMutableURLRequest
ます。connection:didReceiveData:
データ セグメントを受け取り、それをグローバルNSMutableData
オブジェクトに追加するために使用されます。インターネットの問題が原因でエラー メッセージが生成される可能性があり、これは を使用して処理され
connection:didFailWithError:
ます。このハンドラーには、「インターネットに接続していないか、非常に遅いsetText
」というメッセージが表示されたダウンロード ステータス ラベルがあります。1 秒間スリープしてから、再びステップ 1 に戻ります。
コード:
- (void)viewDidLoad
{
[super viewDidLoad];
[self resumeDownload];
}
- (void)resumeDownload
{
NSURL *url = [NSURL URLWithString:video->videoUrl];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
if (receivedData==nil)
{
receivedData = [[NSMutableData alloc] init];
}
else
{
NSString *range = [NSString stringWithFormat:@"bytes=%i-", receivedData.length];
[request setValue:range forHTTPHeaderField:@"Range"];
}
downloadConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
}
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
{
NSLog(@"%@", [response description]);
}
- (void) connection:(NSURLConnection*)connection didFailWithError:(NSError*) error
{
NSLog(@"Download Fail : %d", [error code]);
[status setText:@"No internet conectivity or it is very slow."];
sleep(1);
[self resumeDownload];
}
- (void) connectionDidFinishLoading:(NSURLConnection*)connection
{
// save the file
}
- (void) connection: (NSURLConnection*) connection didReceiveData: (NSData*) data
{
if(connection == downloadConnection)
{
[receivedData appendData:data];
[status setText:[NSString stringWithFormat:@"Downloading: %d Bytes.", receivedData.length]];
}
}
スクリーンショット:
注: インターネットが再接続されると、ダウンロードが自動的に再開されます。
これは問題の適切な解決策ですか?