0

サーバーからmp3ファイルをダウンロードするためにNSURLConnectionを使用しています。私のコードは

- (IBAction)download:(id)sender 
 {
NSURL *url = [NSURL      URLWithString:@"http://viadj.viastreaming.net/start/psalmsmedia/ondemand/Nin%20snehamethrayo.mp3"];    
   NSLog(@"%@", url);
   NSURLRequest *theRequest = [NSURLRequest requestWithURL:url   cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:60];
   receivedData = [[NSMutableData alloc] initWithLength:0];
   NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self startImmediately:YES];


 }

- (void) connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
  [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
  [receivedData setLength:0];
 }

- (void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[receivedData appendData:data];

 }

- (void) connection:(NSURLConnection *)connection didFailWithError:(NSError *)error 
  {

  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;
  [connection release];

  }

- (NSCachedURLResponse *) connection:(NSURLConnection *)connection willCacheResponse:(NSCachedURLResponse *)cachedResponse 
  {

  return nil;

  }

 - (void) connectionDidFinishLoading:(NSURLConnection *)connection 
 {

  [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;

  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

  NSString *documentsDirectoryPath = [[paths objectAtIndex:0]stringByAppendingPathComponent:@"myFile.mp3"];

  [receivedData writeToFile:documentsDirectoryPath atomically:YES];

  [connection release];

  }

ダウンロードボタンをクリックすると、アクティビティインジケーターがアニメーションを開始し、しばらくすると停止します(ダウンロードしていると思います)。しかしその後、ダウンロードしたファイルが iPhone ディスクに見つかりません。ダウンロード後に実際にそれらのファイルが保存された場所。iTunes ファイル共有をサポートするように info.plist を編集しました。

このコードに間違いはありますか?または、ダウンロードしたファイルが表示されないのはなぜですか?

4

1 に答える 1

0

着信音をダウンロードするための 1 つのクラスを作成しました。最初の RingtoneDwonloader.h ファイルを参照してください。

輸入

@protocol RingtoneDownloaderDelegate -(void)downloadingCompleted;

@終わり

@interface RingtoneDownloader : NSObject { NSMutableData *receivedData; NSDate *connectionTime; NSMutableString *diskPath;

id<RingtoneDownloaderDelegate>delegate;

@property(非アトミック、保持) iddelegate;

-(void)createUrlRequestForDownloadRingtone:(NSString *)urlString; -(無効)ダウンロードをキャンセルします。

@終わり

今私のRingtoneDownloader.mファイル、

import "RingtoneDownloader.h"

「AppDelegate.h」をインポート

@interface RingtoneDownloader(){ AppDelegate *_appDelegate; NSURLConnection *theConnection; } @終わり

  @implementation RingtoneDownloader
  @synthesize delegate;
  -(void)createUrlRequestForDownloadRingtone:(NSString *)urlString{

_appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];

NSURLRequest *theRequest=[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]  cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];

// create the connection with the request
// and start loading the data

theConnection =[[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

if (theConnection) {
    // Create the NSMutableData to hold the received data.
    receivedData = [[NSMutableData data] retain];
} else {
    // Inform the user that the connection failed.
}

}

       - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response


{ // このメソッドは、サーバーが[receivedData setLength:0]と判断したときに呼び出されます。// 長い responseLength = [応答の expectedContentLength]; // NSLog(@"%ld", responseLength); }

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

{ // 新しいデータを receivedData に追加します。[受信データappendData:データ]; }

      - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{ // 接続とデータ オブジェクトを解放します [theConnection release];
// receivedData は別の場所でメソッド インスタンスとして宣言されます [receivedData release];

UIAlertView *alt = [[UIAlertView alloc] initWithTitle:@"" message:[NSString stringWithFormat:@"%@", [error localizedDescription]] delegate:nil cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
[alt show];
[alt release];
// inform the user         
NSLog(@"Connection failed! Error - %@ %@", [error localizedDescription], [[error userInfo] objectForKey:NSURLErrorFailingURLStringErrorKey]);

}

       - (void)connectionDidFinishLoading:(NSURLConnection *)connection

{ NSLog(@"成功! %d バイトのデータを受信しました",[receivedData の長さ]); // 接続を解放し、データ オブジェクトを

 _appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
NSString *soundFileName = _appDelegate.ringtoneURL;
NSString *soundFileextension =  [soundFileName substringFromIndex:([soundFileName length]-3)];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.%@", _appDelegate.ringtoneText, soundFileextension]];
NSData *imageData = (NSData *)receivedData;
NSError *err = nil;
BOOL isWriten = [imageData writeToFile:filePath options:NSDataWritingAtomic error:&err];    

if(!isWriten){
    NSLog(@"Ringtone not saved   %@", [err localizedDescription]);
}

[theConnection release];
[receivedData release];    
[delegate downloadingCompleted];

}

   -(void)cancelDownloading{
[theConnection cancel];
[theConnection release];
[delegate downloadingCompleted];

}

ここで、このクラスのインスタンスを作成し、作成するデリゲートを設定する必要があります。その代理人は、着信音ファイルが正常にダウンロードされたかどうかに関する情報を提供します。

アプリで iTunes ファイル共有を使用し、着信音ファイルをアプリのドキュメント ディレクトリにコピーします。

Set "Application supports iTunes file sharing" to YES in your info.plist

ユーザーは iTunes 経由で着信音にアクセスし、デバイスの着信音に追加できるようになりました。

于 2012-05-10T04:18:47.523 に答える