Как мы можем получить доступ к песням в библиотеке Apple Music с _1 _ / _ 2_ для воспроизведения и обработки?
Я задал этот вопрос на форуме Apple.
Как мы можем получить доступ к песням в библиотеке Apple Music с _1 _ / _ 2_ для воспроизведения и обработки?
Я задал этот вопрос на форуме Apple.
Apple Music может относиться к:
Из-за ограничений DRM невозможно воспроизводить треки из каталога Apple Music, загруженные на ваше устройство из клиентов Apple Music для macOS или iOS. Однако вы можете воспроизводить аудиофайлы, принадлежащие и синхронизированы на вашем устройстве с помощью приложения macOS Music или Finder следующим образом:
NSAppleMusicUsageDescription
в файл Info.plist и соответствующее ему значениеAVAudioSession
и AVAudioEngine
MPMediaPickerController
, как в примере ниже, или вы можете создать свой собственный MPMediaQuery
)AVAudioFile
из этого URLAVAudioPlayerNode
набор для воспроизведения этого AVAudioFile
import UIKit
import AVFoundation
import MediaPlayer
class ViewController: UIViewController {
let engine = AVAudioEngine()
override func viewDidLoad() {
super.viewDidLoad()
let mediaPicker = MPMediaPickerController(mediaTypes: .music)
mediaPicker.allowsPickingMultipleItems = false
mediaPicker.showsItemsWithProtectedAssets = false // These items usually cannot be played back
mediaPicker.showsCloudItems = false // MPMediaItems stored in the cloud don't have an assetURL
mediaPicker.delegate = self
mediaPicker.prompt = "Pick a track"
present(mediaPicker, animated: true, completion: nil)
}
func startEngine(playFileAt: URL) {
do {
try AVAudioSession.sharedInstance().setCategory(.playback)
let avAudioFile = try AVAudioFile(forReading: playFileAt)
let player = AVAudioPlayerNode()
engine.attach(player)
engine.connect(player, to: engine.mainMixerNode, format: avAudioFile.processingFormat)
try engine.start()
player.scheduleFile(avAudioFile, at: nil, completionHandler: nil)
player.play()
} catch {
assertionFailure(String(describing: error))
}
}
}
extension ViewController: MPMediaPickerControllerDelegate {
func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) {
guard let item = mediaItemCollection.items.first else {
print("no item")
return
}
print("picking \(item.title!)")
guard let url = item.assetURL else {
return print("no url")
}
dismiss(animated: true) { [weak self] in
self?.startEngine(playFileAt: url)
}
}
func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) {
dismiss(animated: true, completion: nil)
}
}