如何使用 Swift 3 iOS10 为 MPMediaPickerControllerDelegate 呈现带有视图控制器的音乐库?

Posted

技术标签:

【中文标题】如何使用 Swift 3 iOS10 为 MPMediaPickerControllerDelegate 呈现带有视图控制器的音乐库?【英文标题】:How Do I Present a Music Library With a View Controller for a MPMediaPickerControllerDelegate using Swift 3 iOS10? 【发布时间】:2016-09-24 13:25:42 【问题描述】:

我正在尝试关注最近关于使用 MPMediaPickerControllerDelegate 呈现音乐选择列表的帖子。

教程位于此网址:

http://www.justindoan.com/tutorials/

我正在使用此代码:

import UIKit
import MediaPlayer

class ViewController: UIViewController, MPMediaPickerControllerDelegate  

    var mediapicker1: MPMediaPickerController!

    override func viewDidLoad() 
        super.viewDidLoad()


        let mediaPicker: MPMediaPickerController = MPMediaPickerController.self(mediaTypes:MPMediaType.music)
        mediaPicker.allowsPickingMultipleItems = false
        mediapicker1 = mediaPicker
        mediaPicker.delegate = self
        self.presentViewController(mediapicker1, animated: true, completion: nil)
        

但是我发现:

self.presentViewController(mediapicker1, animated: true, completion: nil)

不起作用。不幸的是,Swift 3 建议的自动解决方案也不起作用:

self.present(mediapicker1, animated: true, completion: nil)

此外,ios 10 Beta 发行说明,位于:

https://www.scribd.com/doc/315770725/IOS-10-Beta-Release-Notes

在 18 页的第 10 页上说,

MPMediaPickerController 对象可能无法按预期显示。

我花了很多时间试图自己解决这个问题,但没有成功。

有什么建议吗?

【问题讨论】:

您的链接是 beta 文档的镜像。您应该始终使用 Apple 的官方文档。 iOS 10 已发布且已结束测试版。 @George Lee,我最近在appstore 上发布了一个应用程序,它使用 Swift 3 为 MPMediaPickerControllerDelegate 提供带有视图控制器的音乐库。检查您是否有相同的要求,然后我可以帮助您详细信息(以及代码) @pkc456 那会很好。你能分享这篇文章的代码吗? @GeorgeLee,我已经在answer below 中编写了工作代码。我还提到了您的代码中的一些差异。我对想法持开放态度。 【参考方案1】:

完成这些步骤:

    将“NSAppleMusicUsageDescription”添加到您的 Info.plist 以获得隐私权。 确保您的音乐应用在您的 iPhone 中可用。它在模拟器中不起作用。

【讨论】:

plist 键 NSAppleMusicUsageDescription 不是问题中的代码正常运行所必需的。 @JAL 在新的 iOS10 中,会出现一个空白视图。在 iPhone6 Plus、iOS10 测试。 这个答案是正确的。在 info.plist 中添加 NSAppleMusicUsageDescription 确实允许 MPMediaPickerDelegate 显示音乐列表。它将弹出一个隐私 - 媒体库使用类型:字符串,值:是。【参考方案2】:

根据我们对 cme​​ts 的讨论,我最近在我的最新应用程序 named playmates 中使用了 MPMediaPickerController。我正在与您共享工作代码。我已经编写了不言自明的代码。

import MediaPlayer

class viewControllerName: UIViewController,MPMediaPickerControllerDelegate 

//Below is Inaction for picking music from media library
    @IBAction func btnMediaPickerAction(_ sender: UIButton)         
            let mediaPicker: MPMediaPickerController = MPMediaPickerController.self(mediaTypes:MPMediaType.music)
            mediaPicker.delegate = self
            mediaPicker.allowsPickingMultipleItems = false
            self.present(mediaPicker, animated: true, completion: nil)
        

// MPMediaPickerController Delegate methods
    func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) 
            self.dismiss(animated: true, completion: nil)
        

        func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) 
            self.dismiss(animated: true, completion: nil)
            print("you picked: \(mediaItemCollection)")//This is the picked media item. 
//  If you allow picking multiple media, then mediaItemCollection.items will return array of picked media items(MPMediaItem)
            

我在您的代码中发现了以下差异:

使用self.present 而不是self.presentViewController 无需创建mediaPicker 的全局实例。在委托方法中,您将获得 MPMediaPickerController 的实例

【讨论】:

这仍然不允许我像以前在 iOS10 中那样选择一首歌曲(显示要选择的歌曲列表)。除非我错误地遵循了你的指示。 NSAppleMusicUsageDescription 添加到您的 Info.plist。【参考方案3】:

在 info.plist 中添加隐私 - 媒体库使用说明

【讨论】:

以上是关于如何使用 Swift 3 iOS10 为 MPMediaPickerControllerDelegate 呈现带有视图控制器的音乐库?的主要内容,如果未能解决你的问题,请参考以下文章

iOS 10.2 上的 Swift 3:如何从麦克风订阅单个样本?需要实时处理音频

我如何通过 swift 2.3 项目支持 iOS 版本 10.3

如何在 Xcode 8 和 iOS 10 中使用 AFNetworking 类和 Swift 3 上传图像

Swift 3 / iOS 10,正确使用核心数据

为 FCM 检索令牌的正确方法 - iOS 10 Swift 3

Swift 3 iOS 10 - 将“滑动解锁”动画应用于标签