Можно ли быстро сохранить музыку из библиотеки Ipod в мое приложение?

У меня есть ссылка на MPMediaItem, когда пользователь выбирает звук из библиотеки iPod. Я получаю URL-адрес этого элемента, используя

let url = item.valueForProperty(MPMediaItemPropertyAssetURL) 

Но это не дает мне точное физическое расположение файла, вместо этого оно дает мне URL-адрес по библиотеке iPod.

 ipod-library://item/item.mp3?id=1840064795502796074 

Есть ли способ получить физический URL-адрес песни из библиотеки iPod?

EDIT – на самом деле я хочу извлечь NSData из физического файла и отправить его на мой серверный сервер, поэтому мне нужен физический URL-адрес файла, а не относительный URL-адрес

MPmediaPickerController работает, я выбираю песню и ее воспроизведение, но я не хочу играть в песню. Я пытался загрузить аудиофайлы на сервер. И у меня есть выбор MPMedia Picker в списке аудио, когда я собираюсь выбрать звук, который я загружу на сервер (HTTP), Как я могу это сделать ??? Как получить доступ к медиа-библиотеке с помощью кода Swift?

Адаптируя ответ Кришны, который использует AVAssetExportSession для сохранения MPMediaItem в файл, вы можете сделать что-то вроде следующего в Swift 3:

 /// Export MPMediaItem to temporary file. /// /// - Parameters: /// - assetURL: The `assetURL` of the `MPMediaItem`. /// - completionHandler: Closure to be called when the export is done. The parameters are a boolean `success`, the `URL` of the temporary file, and an optional `Error` if there was any problem. The parameters of the closure are: /// /// - fileURL: The `URL` of the temporary file created for the exported results. /// - error: The `Error`, if any, of the asynchronous export process. func export(_ assetURL: URL, completionHandler: @escaping (_ fileURL: URL?, _ error: Error?) -> ()) { let asset = AVURLAsset(url: assetURL) guard let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A) else { completionHandler(nil, ExportError.unableToCreateExporter) return } let fileURL = URL(fileURLWithPath: NSTemporaryDirectory()) .appendingPathComponent(NSUUID().uuidString) .appendingPathExtension("m4a") exporter.outputURL = fileURL exporter.outputFileType = "com.apple.m4a-audio" exporter.exportAsynchronously { if exporter.status == .completed { completionHandler(fileURL, nil) } else { completionHandler(nil, exporter.error) } } } func exampleUsage(with mediaItem: MPMediaItem) { if let assetURL = mediaItem.assetURL { export(assetURL) { fileURL, error in guard let fileURL = fileURL, error == nil else { print("export failed: \(error)") return } // use fileURL of temporary file here print("\(fileURL)") } } } enum ExportError: Error { case unableToCreateExporter } 

Или, в Swift 2:

 /// Export MPMediaItem to temporary file. /// /// - Parameters: /// - assetURL: The `assetURL` of the `MPMediaItem`. /// - completionHandler: Closure to be called when the export is done. The parameters are a boolean `success`, the `URL` of the temporary file, and an optional `Error` if there was any problem. The parameters of the closure are: /// /// - fileURL: The `URL` of the temporary file created for the exported results. /// - error: The `Error`, if any, of the asynchronous export process. func export(assetURL: NSURL, completionHandler: (NSURL?, ErrorType?) -> ()) { let asset = AVURLAsset(URL: assetURL) guard let exporter = AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetAppleM4A) else { completionHandler(nil, ExportError.unableToCreateExporter) return } let fileURL = NSURL(fileURLWithPath: NSTemporaryDirectory()) .URLByAppendingPathComponent(NSUUID().UUIDString)! .URLByAppendingPathExtension("m4a") exporter.outputURL = fileURL exporter.outputFileType = "com.apple.m4a-audio" exporter.exportAsynchronouslyWithCompletionHandler { if exporter.status == .Completed { completionHandler(fileURL, nil) } else { completionHandler(nil, exporter.error) } } } func exampleUsage(with mediaItem: MPMediaItem) { if let assetURL = mediaItem.assetURL { export(assetURL) { fileURL, error in guard let fileURL = fileURL where error == nil else { print("export failed: \(error)") return } // use fileURL of temporary file here print("\(fileURL)") } } } enum ExportError: ErrorType { case unableToCreateExporter } 

Как вы можете видеть, я помещаю его во временную папку, а не в папку «Документы». Кроме того, я использую UUID, а не количество секунд с некоторой ссылочной даты для создания временного файла. Но идея в основном такая же.

После выбора песни из библиотеки конвертируйте объект MPMediaItem в NSData и загрузите его на сервер с использованием данных с несколькими формами.

Преобразование MPMediaItem в NSData

 -( void)mediaItemToData : (MPMediaItem * ) curItem { NSURL *url = [curItem valueForProperty: MPMediaItemPropertyAssetURL]; AVURLAsset *songAsset = [AVURLAsset URLAssetWithURL: url options:nil]; AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset: songAsset presetName:AVAssetExportPresetAppleM4A]; exporter.outputFileType = @"com.apple.m4a-audio"; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString * myDocumentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; [[NSDate date] timeIntervalSince1970]; NSTimeInterval seconds = [[NSDate date] timeIntervalSince1970]; NSString *intervalSeconds = [NSString stringWithFormat:@"%0.0f",seconds]; NSString * fileName = [NSString stringWithFormat:@"%@.m4a",intervalSeconds]; NSString *exportFile = [myDocumentsDirectory stringByAppendingPathComponent:fileName]; NSURL *exportURL = [NSURL fileURLWithPath:exportFile]; exporter.outputURL = exportURL; // do the export // (completion handler block omitted) [exporter exportAsynchronouslyWithCompletionHandler: ^{ int exportStatus = exporter.status; switch (exportStatus) { case AVAssetExportSessionStatusFailed: { NSError *exportError = exporter.error; NSLog (@"AVAssetExportSessionStatusFailed: %@", exportError); break; } case AVAssetExportSessionStatusCompleted: { NSLog (@"AVAssetExportSessionStatusCompleted"); NSData *data = [NSData dataWithContentsOfFile: [myDocumentsDirectory stringByAppendingPathComponent:fileName]]; [arrayMusic addObject:data]; data = nil; break; } case AVAssetExportSessionStatusUnknown: { NSLog (@"AVAssetExportSessionStatusUnknown"); break; } case AVAssetExportSessionStatusExporting: { NSLog (@"AVAssetExportSessionStatusExporting"); break; } case AVAssetExportSessionStatusCancelled: { NSLog (@"AVAssetExportSessionStatusCancelled"); break; } case AVAssetExportSessionStatusWaiting: { NSLog (@"AVAssetExportSessionStatusWaiting"); break; } default: { NSLog (@"didn't get export status"); break; } } }]; } 
Interesting Posts

Как закодировать строку со специальными символами, которые будут отправляться по URL-адресу? Objective-C

Есть ли способ получить дату и время, защищенную от несанкционированного доступа, на iPhone?

Как я могу защитить свои службы WCF Rest / JSON для использования с приложениями iOS / Android?

Предупреждение Mach-O Linker: слишком много индивидуальных процедур для компактного разговора

Обнаружение, если Realm.io db требуется миграция – если это так, уничтожьте его

Затухание расстояния с помощью OpenAL на iPhone / iPod

UIScrollView нежелательная прокрутка после addSubview или изменения рамки

Установите фиксированную ширину и высоту для «CropRect» в Swift

Предикат Core Data падает, когда атрибут nil

Преобразование JSON в NSArray

iOS 7 Sprite Kit освобождает память

Не удалось отклонить MFMailComposeViewController, делегат не вызван

Ошибка CodeSign: требуется подписание кода для типа продукта «Приложение» в SDK «iOS 5.1»

Доступ / изменение AppDelegate в Xcode во время тестирования пользовательского интерфейса

Что вызывает метод setSelected: NO автоматически

Давайте будем гением компьютера.