我正在编写一个基本的音乐播放器应用程序但在处理应用程序状态转换时遇到一些问题.
我正在使用Swift 3和MPMusicPlayerController.systemMusicPlayer()
目标是这样的:
1)当用户点击主页按钮并且应用程序进入bg(工作)时保持音乐播放
2)如果用户退出应用程序,则停止播放器(myMP.stop())(有时工作,其他时间抛出错误)
我根据可能的操作使用print语句跟踪了流程并得到了:
流程2是我所期望的,但是当应用程序关闭时,Flow 1会抛出一个错误 - 我希望"会终止".
编辑:主要问题是当使用流程1退出应用程序时,永远不会调用"将终止" - 因此永远不会调用"myMP.stop()"并且应用程序退出后播放器继续播放.
如果您在应用程序处于活动状态时单击Home一次(Flow 1)或double(Flow 2),则行为会有明显的不同.
为什么会采用哪两个不同的反应应该是相同的动作?
编辑:最重要的是,如果它永远不会"终止",如何停止MediaPlayer for Flow 1?
编辑:
以下是一些复制问题的示例代码:
AppDelegate.swift
//
// AppDelegate.swift
// Jumbo Player
//
import UIKit
//import MediaPlayer
//doesn't matter where this is declared - here or in ViewController - same results
//let myMP:MPMusicPlayerController = MPMusicPlayerController.systemMusicPlayer()
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for …Run Code Online (Sandbox Code Playgroud) 好吧,我试图让用户从他们的iPod库中选择歌曲来收听,但我仍然希望在我的应用程序中接收远程控制通知(耳机,锁屏osd等),这样我就可以做一些额外的事情.到目前为止,我可以播放iPod音乐或耳机事件,但不能同时播放.
这是我到目前为止所知道的......
如果您使用MPMusicPlayer,则可以轻松地以编程方式访问整个音乐库.但是,无论您使用的是applicationMusicPlayer还是ipodMusicPlayer,它都会收到远程通知.
如果您使用AVAudioPlayer(Apple推荐的播放器用于您应用中的大多数声音),您可以轻松获得远程通知,但它本身无法访问iPod库.
可以使用资产URL初始化AVAudioPlayer,并且iPod库中的轨道(类型MPMediaItem)确实有一个URL属性,该属性返回NSURL实例,文档明确表示它与AVAsset对象一起使用,但是当您尝试使用该文件初始化AVAudioPlayer时NSURL,它失败了.(我使用iPod中的"正在播放"轨道,这是一个MP3,它确实返回了一个有效的NSURL对象,但是初始化失败了.更糟糕的是,当它是一个Audible.com文件时,NSURL属性平坦无效.)
如果您尝试使用AVAudioPlayer的实例来获取远程事件(例如,使用空白声音文件),然后同时使用MPMusicPlayer类播放iPod音乐,您可以远程控制访问,直到您实际启动iPod播放,此时您将丢失它因为您的音频会话被取消激活并且系统音频会话变为活动状态.
如果您尝试与#4相同,但是您将音频会话的类别设置为可混合变体,则会话不会被取消激活,但是一旦iPod开始播放,您仍然会失去远程控制功能.
简而言之,每当MPMusicPlayer正在播放时,我似乎无法获得远程事件,除了使用MPMusicPlayer之外,我不知道从iPod库中播放内容的任何其他方式.
关于如何解决这个问题的任何建议都会受到欢迎.创意或平淡疯狂.只要它有效,就不要在意.
任何人?任何人?Bueller?Bueller?
中号