質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
iOS

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

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Xcode

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

Swift

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

Q&A

解決済

1回答

1595閲覧

曲が再生されない MPMusicPlayerControllerを使用したiosアプリ

773373Aki

総合スコア1

iOS

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

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/07/25 16:50

編集2020/07/25 16:54

前提・実現したいこと

ミュージックライブラリを利用して音楽を再生するiosアプリを作成したいと思っています。
選曲、再生、停止ボタンを実装予定です。

発生している問題・エラーメッセージ

実機にビルドし、ミュージックライブラリから曲を選択完了する時にデバッグエリアにてエラーが出ました。
また、再生ボタンを押すと同じくエラーメッセージが出て、曲が再生されません。

//選択完了時 IntroApp[6706:1902801] [core] "Error returned from daemon: Error Domain=com.apple.accounts Code=9 "(null)"" x3 IntroApp[6706:1902806] [iTunesCloud] [ICUserIdentityStore] Failed to fetch local store account with error: Error Domain=com.apple.accounts Code=9 "(null)". //再生ボタン押した時 IntroApp[6706:1902784] [SDKPlayback] prepareToPlay failed [no target descriptor] IntroApp[6706:1902784] [SDKPlayback] applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong]

該当のソースコード

Swift5

1import UIKit 2import MediaPlayer 3 4class ViewController: UIViewController, MPMediaPickerControllerDelegate { 5 6 @IBOutlet weak var imageView: UIImageView! 7 @IBOutlet weak var artistLabel:UILabel! 8 @IBOutlet weak var albumLabel: UILabel! 9 @IBOutlet weak var songLabel: UILabel! 10 11 var player = MPMusicPlayerController.applicationMusicPlayer 12 13 override func viewDidLoad() { 14 //プレイヤーのインスタンス作成 15 super.viewDidLoad() 16 17 //プレイヤーの準備 18 player = MPMusicPlayerController.applicationMusicPlayer 19 20 // 再生中のItemが変わった時に通知を受け取る 21 let notificationCenter = NotificationCenter.default 22 notificationCenter.addObserver(self, selector: #selector(type(of: self).nowPlayingItemChanged(notification:)), name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: player) 23 24 // 通知の有効化 25 player.beginGeneratingPlaybackNotifications() 26 } 27 28 override func didReceiveMemoryWarning() { 29 super.didReceiveMemoryWarning() 30 } 31 32 ///ミュージックを選択 33 @IBAction func pick(_ sender: AnyObject) { 34 35 //MPMediaPickerControllerのインスタンスを作成 36 let picker = MPMediaPickerController(mediaTypes: .music) 37 // ピッカーのデリゲートを設定 38 picker.delegate = self 39 // 複数選択にする 40 picker.allowsPickingMultipleItems = true 41 42 //icloud上のライブラリを使用可能 43 picker.showsCloudItems = true 44 45 // ピッカーを表示する 46 present(picker, animated: true, completion: nil) 47 } 48 49 //メディアアイテムピッカーでアイテムを選択完了したときに呼び出される 50 func mediaPicker(mediaPicker: MPMediaPickerController, 51 didPickMediaItems mediaItemCollection: MPMediaItemCollection) { 52 53 player.stop() 54 55 // 選択した曲をplayerにセット 56 player.setQueue(with :mediaItemCollection) 57 58 // 選択した曲から最初の曲の情報を表示 59 if let mediaitem = mediaItemCollection.items.first { 60 updateSong(mediaItem: mediaitem) 61 } 62 63 // ピッカーを閉じ、破棄する 64 mediaPicker.dismiss(animated: true, completion: nil) 65 66 } 67 68 //選択がキャンセルされた場合に呼ばれる 69 func mediaPickerDidCancel(mediaPicker: MPMediaPickerController) { 70 // ピッカーを閉じ、破棄する 71 mediaPicker.dismiss(animated: true, completion: nil) 72 } 73 74 //曲情報を表示 75 func updateSong(mediaItem: MPMediaItem) { 76 77 artistLabel.text = mediaItem.albumTitle ?? "不明なタイトル" 78 albumLabel.text = mediaItem.albumArtist ?? "不明なアーティスト" 79 songLabel.text = mediaItem.title ?? "不明な曲" 80 //アートワークを表示 81 if let artwork = mediaItem.artwork { 82 //アートワークの枠サイズを設定 83 let image = artwork.image(at: imageView.bounds.size) 84 //imageviewにアートワークを設定する 85 imageView.image = image 86 } else { 87 //もしアートワークがなければ、灰色表示 88 imageView.image = nil 89 imageView.backgroundColor = UIColor.gray 90 } 91 92 } 93 94 // 再生中の曲が変更になったときに呼ばれる 95 @objc func nowPlayingItemChanged(notification: NSNotification) { 96 97 if let mediaItem = player.nowPlayingItem { 98 updateSong(mediaItem: mediaItem) 99 } 100 } 101 102 deinit { 103 // 再生中アイテム変更に対する監視をはずす 104 let notificationCenter = NotificationCenter.default 105 notificationCenter.removeObserver(self, name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: player) 106 // ミュージックプレーヤー通知の無効化 107 player.endGeneratingPlaybackNotifications() 108 } 109 110 //曲を再生 111 @IBAction func pushPlay(sender: AnyObject) { 112 player.play() 113 } 114 115 //曲を停止 116 @IBAction func pushStop(sender: AnyObject) { 117 player.stop() 118 119 } 120} 121

試したこと

ミュージックの選択時に問題があるのではないかと思い、AppleのDeveroperでmediapickerなどについて調べましたがどこが間違っているかはわかりませんでした。

次のサイトを参考にコードを作成しました。
https://nekokichi2yos2.hatenablog.com/entry/2018/10/09/233709
https://nackpan.net/blog/2016/04/13/ios-swift-musicplayercontroller-2/

同じような質問があったのでこちらも参考にさせていただきました。
https://teratail.com/questions/194113

補足情報(FW/ツールのバージョンなど)

Xcode11.6
Swift5
実機IPhone6s ios13.6

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

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

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

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

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

guest

回答1

0

ベストアンサー

swift

1// ↓アンダーバー 2func mediaPicker(_ mediaPicker: MPMediaPickerController, 3 didPickMediaItems mediaItemCollection: MPMediaItemCollection) { 4} 5// ↓アンダーバー 6func mediaPickerDidCancel(_ mediaPicker: MPMediaPickerController) { 7}

デリゲートのメソッドが正しく実装されていないので、これらのメソッドがコールされていません。
applicationQueuePlayer _establishConnectionIfNeeded timeout [ping did not pong] は、Queueに曲がないのに再生をしようとしているので発生しています。
[iTunesCloud] [ICUserIdentityStore] Failed to fetch local store account with error: Error Domain=com.apple.accounts Code=9 "(null)" の警告はなんかよくわからないけど出ますね。とりあえず動作に影響はないようですが……

swift

1deinit { 2 // 再生中アイテム変更に対する監視をはずす 3 let notificationCenter = NotificationCenter.default 4 notificationCenter.removeObserver(self, name: NSNotification.Name.MPMusicPlayerControllerNowPlayingItemDidChange, object: player) 5 // ミュージックプレーヤー通知の無効化 6 player.endGeneratingPlaybackNotifications() 7}

相当古い資料を参考にされているのだと思いますが、deinitでremoveObserverする必要はありません。iOS9以降、使われなくなったobserverは勝手に開放されることになっています。
ViewControllerにおいては、 viewDidAppearviewWillAppear の対になる処理をしたいときは viewWillDisappearviewDidDisappear に実装したほうがよいと思います。

swift

1override func viewWillDisappear(_ animated: Bool) { 2 super.viewWillDisappear(true) 3 player.endGeneratingPlaybackNotifications() 4}

投稿2020/07/26 01:22

thyda.eiqau

総合スコア2982

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

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

773373Aki

2020/07/26 04:27

無事に曲を再生することができました。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問