🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

1447閲覧

エラーを解決したいです

hase3103

総合スコア7

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2019/12/25 11:14

編集2019/12/26 23:10

前提・実現したいこと

ホーム画面を作成し、レイアウトしたボタンから音楽再生画面に飛ぶアプリを作成しています。

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        }         }

補足情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

weekplane

2019/12/28 03:25 編集

(削除しました)
hase3103

2019/12/27 23:06

MPRequestResponseControllerはどこで確認出来るのでしょうか? 自分でそのようなファイルを作ったりはしてないのですが、、 知識が全然なくて申し訳ありません
weekplane

2019/12/28 03:25

混乱させてしまい,申し訳ございません. 上記自分の勘違いでしたので削除させていただきます. 申し訳ございません.
guest

回答1

0

ベストアンサー

コードをコピペして動かしてみるとエラーが再現しましたが、
deinit処理の中のplayer.endGeneratingPlaybackNotifications()
余計な気がしたので、これを削除するとエラーが発生しなくなりました。

そもそも、iOS9以降ではdeinitの中でremoveObserverする必要がなくなったので、
AudioViewControllerを廃棄する時にどこかで自動的に
endGeneratingPlaybackNotificationsも行われるようになっていて、
2回end処理が行われて今のエラーになったのではないかなと推測します。

(参考)
https://fromatom.hatenablog.com/entry/2017/12/13/135542

今はもうdeinit処理全体を削除してしまった方が安定しそうな気がします。

投稿2019/12/28 03:33

編集2019/12/28 03:36
TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hase3103

2019/12/29 05:06

TakeOneさん 教えていただいた通り、該当コードを削除したらエラーが解消されました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問