前提・実現したいこと
ホーム画面を作成し、レイアウトしたボタンから音楽再生画面に飛ぶアプリを作成しています。
https://nekokichi2yos2.hatenablog.com/entry/2018/10/09/233709
↑コード参考記事
上記記事を参考に ホーム画面⇒ミュージックライブラリ⇒音楽再生画面に移動していき、実機で音楽再生まではできたのですが
その後ホーム画面に戻るとアプリが落ちてしまいます。
落ちてしまった時のエラーを確認し、調べてみたのですがエラー内容が理解できず…
原因、改善方法を教えてください。
画面遷移自体はストーリーボードとセグエで行っています
発生している問題・エラーメッセージ
Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger. The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKitCore/UIView.h> may also be helpful. 2019-12-25 19:08:11.783383+0900 00_app[1227:410743] Unbalanced calls to begin/end appearance transitions for <00_app.AudioViewController: 0x16155afb0>. 2019-12-25 19:08:17.407929+0900 00_app[1227:410947] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)"" 2019-12-25 19:08:17.411055+0900 00_app[1227:410947] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)"" 2019-12-25 19:08:17.414058+0900 00_app[1227:411000] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)"" 2019-12-25 19:08:17.414301+0900 00_app[1227:410947] [iTunesCloud] [ICUserIdentityStore] Failed to fetch local store account with error: Error Domain=com.apple.accounts Code=9 "(null)". 2019-12-25 19:08:30.756155+0900 00_app[1227:410743] [SDKPlayback] -[MPMusicPlayerController skipToNextItem] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1 "No commands provided." UserInfo={NSDebugDescription=No commands provided.} 2019-12-25 19:08:37.006612+0900 00_app[1227:410743] [SDKPlayback] -[MPMusicPlayerController skipToPreviousItem] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1 "No commands provided." UserInfo={NSDebugDescription=No commands provided.} 2019-12-25 19:08:37.505277+0900 00_app[1227:410743] [SDKPlayback] -[MPMusicPlayerController setCurrentPlaybackTime:0] completed id=applicationMusicPlayer error: Error Domain=MPCPlayerRequestErrorDomain Code=1 "No commands provided." UserInfo={NSDebugDescription=No commands provided.} 2019-12-25 19:08:37.520440+0900 00_app[1227:411185] [RemoteControl] userIdentityForMediaRemoteOptions -❗️No user identity data. Using active account. 2019-12-25 19:08:37.607054+0900 00_app[1227:411257] [Middleware] INVALIDATE: 0x283e78990: Invalidated before returning a response. Re-requesting items. 2019-12-25 19:09:02.543268+0900 00_app[1227:410743] *** Assertion failure in -[MPRequestResponseController endAutomaticResponseLoading], /BuildRoot/Library/Caches/com.apple.xbs/Sources/MediaPlayer/MobileMusicPlayer-4017.300.8/Request Response/MPRequestResponseController.m:207 2019-12-25 19:09:02.543975+0900 00_app[1227:410743] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Mismatched begin/endAutomaticResponseLoading.' *** First throw call stack: (0x1a46baa48 0x1a43e1fa4 0x1a45bce88 0x1a49f26c4 0x1b0b72304 0x102d8ebd8 0x102d917dc 0x102da4a4c 0x102d9caa4 0x1a46385e4 0x1a46335d8 0x1a4632adc 0x1ae5b8328 0x1a872dae0 0x102941ac4 0x1a44bc360) libc++abi.dylib: terminating with uncaught exception of type NSException
該当のソースコード
コード:
import UIKit import MediaPlayer class AudioViewController: UIViewController,MPMediaPickerControllerDelegate { @IBOutlet weak var songimageView: UIImageView! @IBOutlet weak var songname: UILabel! @IBOutlet weak var artistname: UILabel! @IBOutlet weak var playButton: UIButton! @IBOutlet weak var scrubBar: UISlider! //MediaPlayerのインスタンスを作成 var player:MPMusicPlayerController! //タイマー変数を定義 var timer = Timer() //次に再生するか一時停止するかを判断 var playorpause = 0 //曲が再生される前かされた後かを判定 var flag = 0 //曲の現在位置を一次的に保持 var currenttime = 0.0 //曲の長さを保持する変数 var timeinterval = TimeInterval() override func viewDidLoad() { super.viewDidLoad() //背景 let backgroundImage = UIImage(named: "78380837")! self.view.backgroundColor = UIColor(patternImage: backgroundImage) //プレイヤーの準備 player = MPMusicPlayerController.applicationMusicPlayer //?? let notificationcenter = NotificationCenter.default notificationcenter.addObserver(self, selector: #selector(type(of: self).nowPlayingItemChanged(notification:)), name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: player) //初期化 scrubBar.value = 0.0 //再生されてないのにタップしてエラーが出るのを防ぐため scrubBar.isHidden = true //初期画面をピッカー画面にする //誤って、再生ボタンを押してエラーが出るのを防ぐため //MPMediaPickerのインスタンス let picker = MPMediaPickerController() //ピッカーのデリゲートを設定 picker.delegate = self //複数選択を不可にする picker.allowsPickingMultipleItems = true //ピッカー画面を表示 present(picker, animated: true, completion: nil) // Do any additional setup after loading the view, typically from a nib. } //再生中の曲が変更された時に実行 @objc func nowPlayingItemChanged(notification:NSNotification) { //もし再生できる状態なら if let playingitem = player.nowPlayingItem { updatesong(mediaItem: playingitem) } } //使用した〇〇を破棄する deinit { let notificationcenter = NotificationCenter.default notificationcenter.removeObserver(self, name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: player) // player.endGeneratingPlaybackNotifications() } //曲の情報を表示する func updatesong(mediaItem: MPMediaItem) { //曲情報を表示 songname.text = mediaItem.title ?? "不明なタイトル" artistname.text = mediaItem.albumArtist ?? "不明なアーティスト" timeinterval = mediaItem.playbackDuration //アートワークを表示 if let artwork = mediaItem.artwork { //アートワークの枠サイズを設定 let image = artwork.image(at: songimageView.bounds.size) //imageviewにがアートワークを設定する songimageView.image = image } else { //もしアートワークがなければ、何も表示しない songimageView.image = nil } } //ピッカー画面で曲が選択された時 func mediaPicker(_ mediaPicker: MPMediaPickerController, didPickMediaItems mediaItemCollection: MPMediaItemCollection) { //プレイヤーを止める player.stop() //選択した曲をplayerにセット player.setQueue(with: mediaItemCollection) //選択した曲の情報をラベルやイメージビューにセット if let mediaitem = mediaItemCollection.items.first { updatesong(mediaItem: mediaitem) } //ピッカーを閉じて、破棄する dismiss(animated: true, completion: nil) } //スライダーの位置を曲の再生位置と同期する @objc func updateslider(){ self.scrubBar.setValue(Float(self.player.currentPlaybackTime), animated: true) } //曲が選択されなかった時 func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) { dismiss(animated: true, completion: nil) } //選択画面へを押した場合 @IBAction func pick(_ sender: Any) { //flag変数を初期化 flag = 0 //timerを破棄する timer.invalidate() //プレイヤーを一旦停止する player.pause() //曲が停止されたことを示す playButton.setTitle("▶︎", for: UIControl.State()) //MPMediaPickerのインスタンス let picker = MPMediaPickerController() //ピッカーのデリゲートを設定 picker.delegate = self //複数選択を不可にする picker.allowsPickingMultipleItems = true //ピッカー画面を表示 present(picker, animated: true, completion: nil) } @IBAction func play(_ sender: Any) { //もし停止中なら if playorpause == 0{ //保持した位置を代入 player.currentPlaybackTime = currenttime //再生 player.play() //再生中であることを示す playorpause = 1 //画像を再生のマークに playButton.setTitle("||", for: UIControl.State()) //もしまだ1度も再生されてなければ if flag == 0 { scrubBar.isHidden = false scrubBar.maximumValue = Float(timeinterval) flag = 1 } //スライダーと曲を同期 timer = Timer.scheduledTimer(timeInterval: 0.5, target: self, selector: #selector(updateslider), userInfo: nil, repeats: true) } //もし曲が再生中なら else { //停止した位置を保持 currenttime = player.currentPlaybackTime //タイマーを停止し、曲を一時停止 timer.invalidate() player.pause() playorpause = 0 playButton.setTitle("▶︎", for: UIControl.State()) } } //次の曲へ @IBAction func next(_ sender: Any) { player.skipToNextItem() playButton.setTitle("||", for: UIControl.State()) } //前の曲へ @IBAction func back(_ sender: Any) { player.skipToPreviousItem() playButton.setTitle("||", for: UIControl.State()) } //スライダーを移動した位置を曲の再生位置に設定 @IBAction func scrubAction(_ sender: Any) { player.currentPlaybackTime = TimeInterval(scrubBar.value) currenttime = player.currentPlaybackTime } override var shouldAutorotate: Bool { return true } override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return UIInterfaceOrientationMask.landscape } }
補足情報
回答1件
あなたの回答
tips
プレビュー