Table of Contents
iOS用高性能カスタム音楽プレーヤーの構築
iOS用のカスタム音楽プレーヤーを開発するのは、再生ボタンでをラップするのをはるかに超えています。 ユーザーは、シームレスなバックグラウンド再生、豊かな今再生の統合、AirPlayのサポート、ネイティブを感じる応答制御を期待しています。 このガイドでは、Swift、UIKit、およびのような近代的なフレームワークを使用して高度な制御を備えたプロダクション対応音楽プレーヤーを作成することであなたを歩きます。 私たちは、アーキテクチャ、UIデザイン、背景オーディオ、リモートコントロール、およびパフォーマンスチューニングをカバーしているので、App StoreでApp Storeをすることができます。
コアアーキテクチャ:AVFoundationを活用する
iOS のカスタム音楽プレーヤーは、]AVFoundationから始まります。 プライマリプレーヤークラスは](ストリーミングとローカルファイルの場合)と(よりシンプルなローカルオーディオ再生のために)です。 フル機能プレーヤーの場合、] AVPlayer]]]は、ストリーミング、タイムされたメタデータ、およびAirPlayerモードと統合をサポートするため、より良い選択肢です。
プレイヤーのインスタンスの設定
インスタンスを保持する単行またはサービスクラスを作成します。これにより、ビューコントローラー全体で永続的な再生状態が確保されます。ローカルまたはリモート URL でプレーヤーを構成します。
import AVFoundation
class MusicPlayerManager {
static let shared = MusicPlayerManager()
let player: AVPlayer
private init() {
player = AVPlayer()
configureAudioSession()
}
func play(url: URL) {
let item = AVPlayerItem(url: url)
player.replaceCurrentItem(with: item)
player.play()
}
}
常にオーディオセッションカテゴリを].playbackに設定します。そのため、電話がロックされたり、サイレントモードで動作し続けます。これは、任意の音楽アプリで必須です。
プレイヤーの米国を管理する
の[]との[]を使用して、再生状態の変化(再生、パユース、ネットワークの待機)に反応します。 []を介してを観察すると、進行中のスライダーと経過時間ラベルが駆動されます。
SwiftUI でユーザーインターフェイスの設計
UIKit は成熟している間、 [SwiftUI[ は、より高速な反復と音楽プレーヤー UI に最適な宣言的な構文を提供します。 アルバムアート、トラック情報、進捗状況スライダ、ボリュームコントロール、および再生ボタンでクリーンなレイアウトを作成します。
主UIの部品
- []Album Art View – リモートURLまたはローカルアセットからカバーアートワークをロードする[]。
- [] と アーティスト ラベル – ダイナミックなテキストで、ビューモデルの [] プロパティをアップデートします。
- []プログレススライダー] - カスタム[トラックと親指の色でスタイル化し、プレーヤーの現在の時間にバインド。
- []Volume Slider]] – システムボリュームをターゲティングするときに[を使うか、[]を設定したカスタムスライダを作成する(注:システムボリュームは一貫性のために優先されます)。
- []再生/マウス、フォワード、バックワードボタン[] - 明確にラベル付けされ、触発的なフィードバック。
iPadでうまくスケールするべきアルバムアートのために、特に異なる画面サイズに適応するために[を使用します。
UIをプレーヤーに接続する
ビューモデルは[に合致し、現在のトラック、再生時間、再生状態を発行しましょう。 SwiftUIビューは、以下を観察します。
class PlayerViewModel: ObservableObject {
@Published var currentTime: TimeInterval = 0
@Published var isPlaying = false
@Published var currentTrack: Track?
// … bindings to MusicPlayerManager
}
と、または定期的な時間オブザーバーを使ってをスムーズに更新します。
リモートコントロールと今すぐ情報を統合
プロの音楽プレーヤーは、リモートコントロールイベント(ロック画面、コントロールセンター、Apple Watch、AirPods)に応答し、「Now Playing」情報を表示しなければなりません。これは[]]]MPNowPlayingInfoCenterと[[]MPRemoteCommandCenterを介して行われます。
リモートコマンドの設定
[ または、プレイヤーマネージャーで、オーディオセッションが有効になった後にリモートコマンドセンターを設定してください。
import MediaPlayer
func setupRemoteCommands() {
let commandCenter = MPRemoteCommandCenter.shared()
commandCenter.playCommand.addTarget { [weak self] _ in
self?.player.play()
return .success
}
commandCenter.pauseCommand.addTarget { [weak self] _ in
self?.player.pause()
return .success
}
commandCenter.nextTrackCommand.addTarget { [weak self] _ in
self?.skipToNext()
return .success
}
commandCenter.previousTrackCommand.addTarget { [weak self] _ in
self?.skipToPrevious()
return .success
}
commandCenter.changePlaybackPositionCommand.addTarget { [weak self] event in
guard let event = event as? MPChangePlaybackPositionCommandEvent else { return .commandFailed }
self?.player.seek(to: CMTime(seconds: event.positionTime, preferredTimescale: 1000))
return .success
}
}
Xcode プロジェクトで背景モードを有効にします。対象を選択し、署名と機能に移動し、「背景モード」を追加し、「Audio、AirPlay、画像の画像」をチェックします。
最新プレイ情報
トラックの変更や再生状況の更新を毎回、[]]、[]、 、 []、 []]]などの辞書でを呼び出します。 アートワークのために、 []をに変換します。
背景音声セッションで背景音声の処理
起動時に音声セッションを構成します。
func configureAudioSession() {
do {
let session = AVAudioSession.sharedInstance()
try session.setCategory(.playback, mode: .default, policy: .longFormAudio)
try session.setActive(true)
} catch {
print("Failed to set audio session: \(error)")
}
}
音声を録音したり使用したりするアプリは、カテゴリーに注意してください。音楽プレーヤーは、ほぼ常にを使用して、オーディオがバックグラウンドで継続していることを確認します。デバイスでテスト:画面をロックし、再生を検証します。コントロールセンターは、「今の再生」カードが表示されます。
高度な制御を実行:イコライザー、プレイリスト、およびAirPlay
基本が機能したら、上級機能でプレイヤーを差別化します。
グラフィックイコライザー
[を]で10バンドまたはカスタムイコライザを適用します。 これは、エンジンベースのアプローチでを置き換えるか、エンジンに[を接続する必要があります。 [のAppleの文書は、サンプルコードを提供します。 プリセットバンド(ロック、ポップ、ジャズ)を提供し、カスタムスライダーを許可します。
プレイリスト管理
コアデータまたはSwiftDataでプレイリストを保存します。各プレイリストには、トラックURL(ローカルまたはリモート)の注文リストが含まれています。[またはでドラッグアンドドロップのリオーダーを実行します。[]バックグラウンド設定を使用してオフラインのダウンロードをサポートしているので、アプリの外でダウンロードが続行します。
エアプレイと外部デバイス
] にオーディオセッションが設定されていると、自動的にAirPlayをサポートし、ルートが使用可能です。 細かい操作のために、 のルートピッカーまたは (iOS 11 +) を使用します。 必要に応じてローカルの再生を強制するためにトグルを提供します。
試験・性能の最適化
ミュージックプレーヤーは、応答性でなければなりません。 これらのヒントに従って、アプリを高速かつバッテリーに優しい状態に保つことができます。
- [インスツルメンツのプロファイル - タイムプロファイラとコアアニメーションの楽器を使用して、メインスレッドのブロックを検出します。 各フレームに重いUIのアップデートを避けてください。 スロットルスライダーは〜30 FPSに更新します。
- ]Buffering Strategy] – ]] をセットして、起動時間とメモリ使用量のバランスをとります。 10秒の値はほとんどのストリームで動作します。
- メモリーマネジメント] - トラックを切り替えるとき、古いプレーヤーアイテムとアートワークの画像を解放します。 アルバムアートの[]を使用してください。
- [] 背景のクラッシュ処理 - 再生中にプレーヤー管理者が取引されていないことを確認してください。 必要に応じて強力な参照を使用して、再初期化します。
実機デバイスのテスト
シミュレータは、バックグラウンドオーディオ、AirPlay、またはボリュームコントロールを正確にテストすることはできません。 常に異なるiOSバージョンを実行している物理的なiPhoneやiPadでテストします。 コントロールセンターが正しく更新され、ロック画面がアルバムアートを表示することを確認してください。
iOS音楽プレーヤー開発に最適な練習
制作経験から数年を経た経験から、ここにはさらなる提案があります。
- パフォーマンスを最適化] - 大規模なプレイリストとサムネイルサイズの事前デコードアートワークのレイジーローディングを使用します。
- [Designの直観的なUI - アップルのヒューマンインターフェイスガイドラインに従って、メディア再生。シャッフルや繰り返しなどの標準アクションのためのシステムアイコンを使用します。
- ハンドル割込みが優雅に – を聞いて、それに応じて一時停止/再開します。 電話が来る場合は一時的なオーバーレイが表示されます。
- []ユーザーのプライバシーを尊重 - マイクの許可を要求するだけ(例えば、音声コマンド)。 常に理由を説明してください。
- [アクセシビリティ]を提供] – すべてのボタンをラベル付けし、VoiceOverをサポートし、ラベルの動的タイプを採用します。
コンテンツ
iOSの高度な制御を持つカスタム音楽プレーヤーを構築することはやりがいがありますが、オーディオセッション管理、リモートコントロール統合、UIの応答性の詳細に注意が必要です。 AVFoundation、 ]MPNowPlayingInfoCenter、および徹底的に]SwiftUI]を使用すると、あなたは、再生されたプレーヤーに、再生されたプレーヤーと同等の機能を付加するアプリを作成することができます。 プレイリストは、再生するプレーヤーや、再生するような音楽を再生するような機能を提供します。
更に読みたいなら、Appleの]AVFoundation Media Playback documentation、]]]MediaPlayerフレームワークリファレンス、および[]]]]Audioインタールプションガイド[])を調べてください。これらのリソースは、エッジケースを処理し、堅牢な製品を提供します。