ios - Swift 将音乐库导入我的 iOS 应用程序,并为 iTunes 音乐、苹果音乐提供不同的 tableview 单元格
问题描述
我正在开发一个应用程序,它应该显示用户的 iOS 音乐应用程序中的所有音乐,我试图让事情正常工作,但不幸的是我不知道如何不在应用程序上显示苹果音乐歌曲,因为我没有没有授权。但我的应用程序仍然会提取数据并显示tableview
. 当我点击苹果音乐中的音乐时,我的应用程序崩溃了。我认为这是因为身份验证。
请让我知道当我请求查看用户库时是否有任何解决方案可以不显示苹果音乐歌曲。
import UIKit
import MediaPlayer
import AVFoundation
class Tableview: UIViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var tableView : UITableView?
let myTableView: UITableView = UITableView( frame: CGRect.zero, style: .grouped )
var albums: [AlbumInfo] = []
var songQuery: SongQuery = SongQuery()
var audio: AVAudioPlayer?
override func viewDidLoad() {
super.viewDidLoad()
tableView?.dataSource = self
tableView?.delegate = self
self.title = "Music"
MPMediaLibrary.requestAuthorization { (status) in
if status == .authorized {
self.albums = self.songQuery.get(songCategory: "")
DispatchQueue.main.async {
self.tableView?.rowHeight = UITableView.automaticDimension;
self.tableView?.estimatedRowHeight = 60.0;
self.tableView?.reloadData()
}
} else {
self.displayMediaLibraryError()
}
}
}
func displayMediaLibraryError() {
var error: String
switch MPMediaLibrary.authorizationStatus() {
case .restricted:
error = "Media library access restricted by corporate or parental settings"
case .denied:
error = "Media library access denied by user"
default:
error = "Unknown error"
}
let controller = UIAlertController(title: "Error", message: error, preferredStyle: .alert)
controller.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
controller.addAction(UIAlertAction(title: "Open Settings", style: .default, handler: { (action) in
if #available(iOS 10.0, *) {
UIApplication.shared.open(URL(string: UIApplication.openSettingsURLString)!, options: [:], completionHandler: nil)
} else {
// Fallback on earlier versions
}
}))
present(controller, animated: true, completion: nil)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
func numberOfSections(in tableView: UITableView) -> Int {
return albums.count
}
func tableView( _ tableView: UITableView, numberOfRowsInSection section: Int ) -> Int {
return albums[section].songs.count
}
func tableView( _ tableView: UITableView, cellForRowAt indexPath:IndexPath ) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: "MusicPlayerCell",
for: indexPath) as! MusicPlayerCell
cell.labelMusicTitle?.text = albums[indexPath.section].songs[indexPath.row].songTitle
cell.labelMusicDescription?.text = albums[indexPath.section].songs[indexPath.row].artistName
let songId: NSNumber = albums[indexPath.section].songs[indexPath.row].songId
let item: MPMediaItem = songQuery.getItem( songId: songId )
if let imageSound: MPMediaItemArtwork = item.value( forProperty: MPMediaItemPropertyArtwork ) as? MPMediaItemArtwork {
cell.imageMusic?.image = imageSound.image(at: CGSize(width: cell.imageMusic.frame.size.width, height: cell.imageMusic.frame.size.height))
}
return cell;
}
func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return albums[section].albumTitle
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let songId: NSNumber = albums[indexPath.section].songs[indexPath.row].songId
let item: MPMediaItem = songQuery.getItem( songId: songId )
let url: NSURL = item.value( forProperty: MPMediaItemPropertyAssetURL ) as! NSURL
if AVAsset(url: url as URL ) .isPlayable
{
do {
audio = try AVAudioPlayer(contentsOf: url as URL)
guard let player = audio else { return }
player.prepareToPlay()
player.play()
} catch let error {
print(error.localizedDescription)
}
}
self.title = albums[indexPath.section].songs[indexPath.row].songTitle
}
}
import Foundation
import MediaPlayer
import AVFoundation
import MediaToolbox
struct SongInfo {
var albumTitle: String
var artistName: String
var songTitle: String
var songId : NSNumber
}
struct AlbumInfo {
var albumTitle: String
var songs: [SongInfo]
}
class SongQuery {
func get(songCategory: String) -> [AlbumInfo] {
var albums: [AlbumInfo] = []
let albumsQuery: MPMediaQuery
if songCategory == "Artist" {
albumsQuery = MPMediaQuery.artists()
} else if songCategory == "Album" {
albumsQuery = MPMediaQuery.albums()
} else {
albumsQuery = MPMediaQuery.albums()
}
// let albumsQuery: MPMediaQuery = MPMediaQuery.albums()
let albumItems: [MPMediaItemCollection] = albumsQuery.collections! as [MPMediaItemCollection]
// var album: MPMediaItemCollection
for album in albumItems {
let albumItems: [MPMediaItem] = album.items as [MPMediaItem]
// var song: MPMediaItem
var songs: [SongInfo] = []
var albumTitle: String = ""
for song in albumItems {
if songCategory == "Artist" {
albumTitle = song.value( forProperty: MPMediaItemPropertyArtist ) as! String
} else if songCategory == "Album" {
albumTitle = song.value( forProperty: MPMediaItemPropertyAlbumTitle ) as! String
} else {
albumTitle = song.value( forProperty: MPMediaItemPropertyAlbumTitle ) as! String
}
let songInfo: SongInfo = SongInfo(
albumTitle: song.value( forProperty: MPMediaItemPropertyAlbumTitle ) as! String,
artistName: song.value( forProperty: MPMediaItemPropertyArtist ) as! String,
songTitle: song.value( forProperty: MPMediaItemPropertyTitle ) as! String,
songId: song.value( forProperty: MPMediaItemPropertyPersistentID ) as! NSNumber
)
songs.append( songInfo )
}
let albumInfo: AlbumInfo = AlbumInfo(
albumTitle: albumTitle,
songs: songs
)
albums.append( albumInfo )
}
return albums
}
func getItem( songId: NSNumber ) -> MPMediaItem {
let property: MPMediaPropertyPredicate = MPMediaPropertyPredicate( value: songId, forProperty: MPMediaItemPropertyPersistentID )
let query: MPMediaQuery = MPMediaQuery()
query.addFilterPredicate( property )
var items: [MPMediaItem] = query.items! as [MPMediaItem]
return items[items.count - 1]
}
}
解决方案
推荐阅读
- java - 如何修复 Java2Word 生成的 ms-word 文档中的错误
- node.js - 通过节点 js 中的 JavaScript 的 Html datalist 选项
- laravel - 合并 2 个集合(保留相似的集合)
- angular - ngx-charts-bar-vertical-stacked 中没有数据显示
- angular - 第一次请求时,Asp.net core 2.2 很慢
- c - 将 n 值分配给大小为 n 的数组的时间复杂度是 O(n) 吗?
- java - 如何创建包含字符串内容的 txt 文件并下载该 txt 文件
- swift - 我正在集合视图中的 AVPlayer 中加载视频,但它重复了一些单元格数据
- python - Python requests 在下载图像时说 400 Bad requests
- gitlab-ci - 如何在 fastlane 中设置环境变量以创建模板