1K Views
October 18, 24
スライド概要
CarPlay対応アプリを 作る 2024.10.18 Mobile Act OSAKA #14 itok@そらかぜ
itok@そらかぜ • いとうけい(itok) • の中の人 • モバイルアプリエンジニア 兼 CEO • 副業でフリーランス的 • https://itok.jp/, https://sorakaze.co.jp/, @itokjp
所在地:京都市中京区 社員1人=自分
実績 自社 受託 公私合わせて200件以上のアプリ開発に携わる
iOS / Android / macOS / Windows / サーバ 一人でやってます(デザイン以外)
AI + 天気予報 「そらコーデ」公開!!
関西圏のJR車内で広告でてます
CarPlay 📱➰🚗
CarPlayを使って アプリでできること • 音楽再生 • メッセージ • ナビ • 駐車、給油、充電、食事注文
CarPlay対応 音楽再生アプリ OTOKIKU
CarPlayは 専用のUIを持った 外部ディスプレイです つまりターゲットの追加は不要 アプリ本体のプロセスで動作
必要なもの
実機(クルマ🚙)
シミュレータ
Appleヘの事前申請 • CarPlay使用許可 (Entitlements) が必要 • どんなアプリを作るのかをAppleに申請 2023年当時、3日ほどで申請通過
実装 • • 音楽再生機能(CarPlayとは直接関係なし) • リモコン対応 • Now Playing対応 CarPlay独自実装
リモコン対応 let commandCenter = MPRemoteCommandCenter.shared() commandCenter.togglePlayPauseCommand.addTarget { _ in playOrPause() return .success }
Now Playing対応 let info: [String: Any] = [ MPMediaItemPropertyArtist: アーティスト, MPNowPlayingInfoPropertyPlaybackRate: 再生速度, MPNowPlayingInfoPropertyElapsedPlaybackTime: 経過時間, MPMediaItemPropertyPlaybackDuration: 合計時間, MPMediaItemPropertyTitle: タイトル, MPMediaItemPropertyArtwork: アートワーク, ] MPNowPlayingInfoCenter.default().nowPlayingInfo = info
Now Playing対応 let info: [String: Any] = [ MPMediaItemPropertyArtist: アーティスト, MPNowPlayingInfoPropertyPlaybackRate: 再生速度, MPNowPlayingInfoPropertyElapsedPlaybackTime: 経過時間, MPMediaItemPropertyPlaybackDuration: 合計時間, MPMediaItemPropertyTitle: タイトル, MPMediaItemPropertyArtwork: アートワーク, ] MPNowPlayingInfoCenter.default().nowPlayingInfo = info
CarPlay独自実装 • プロジェクト設定 • 再生アイテムへのナビゲーション • テンプレートに対してコンテンツを指定する形式
プロジェクト設定 fi App ID Con guration
プロジェクト設定 Entitlements.plist Info.plist
ナビゲーション class CarPlaySceneDelegate: UIResponder, CPTemplateApplicationSceneDelegate { func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene, didConnect interfaceController: CPInterfaceController) { var items = [CPListItem]() for ... { let item = CPListItem(text: "曲タイトル", detailText: nil) // 項目選択 item.handler = { item, completion in // 再生 playItem() // 再生画面へ遷移 interfaceController.pushTemplate(CPNowPlayingTemplate.shared, ...) completion() } items.append(item) } // 一覧表示テンプレート let template = CPListTemplate(title: "", sections: [CPListSection(items: items)]) interfaceController.setRootTemplate(template, animated: false, completion: nil) } }
一覧表示
再生
自作のアプリとともに 楽しいカーライフを🚗