20241018 CarPlay対応アプリを作る

1K Views

October 18, 24

スライド概要

profile-image

いとーけー@そらかぜ

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

CarPlay対応アプリを 作る 2024.10.18 Mobile Act OSAKA #14 itok@そらかぜ

2.

itok@そらかぜ • いとうけい(itok) • の中の人 • モバイルアプリエンジニア 兼 CEO • 副業でフリーランス的 • https://itok.jp/, https://sorakaze.co.jp/, @itokjp

3.

所在地:京都市中京区 社員1人=自分

4.

実績 自社 受託 公私合わせて200件以上のアプリ開発に携わる

5.

iOS / Android / macOS / Windows / サーバ 一人でやってます(デザイン以外)

6.

AI + 天気予報 「そらコーデ」公開!!

7.

関西圏のJR車内で広告でてます

8.

CarPlay 📱➰🚗

10.

CarPlayを使って アプリでできること • 音楽再生 • メッセージ • ナビ • 駐車、給油、充電、食事注文

11.

CarPlay対応 音楽再生アプリ OTOKIKU

12.

CarPlayは 専用のUIを持った 外部ディスプレイです つまりターゲットの追加は不要 アプリ本体のプロセスで動作

13.

必要なもの

14.

実機(クルマ🚙)

15.

シミュレータ

16.

Appleヘの事前申請 • CarPlay使用許可 (Entitlements) が必要 • どんなアプリを作るのかをAppleに申請 2023年当時、3日ほどで申請通過

17.

実装 • • 音楽再生機能(CarPlayとは直接関係なし) • リモコン対応 • Now Playing対応 CarPlay独自実装

18.

リモコン対応 let commandCenter = MPRemoteCommandCenter.shared() commandCenter.togglePlayPauseCommand.addTarget { _ in playOrPause() return .success }

19.

Now Playing対応 let info: [String: Any] = [ MPMediaItemPropertyArtist: アーティスト, MPNowPlayingInfoPropertyPlaybackRate: 再生速度, MPNowPlayingInfoPropertyElapsedPlaybackTime: 経過時間, MPMediaItemPropertyPlaybackDuration: 合計時間, MPMediaItemPropertyTitle: タイトル, MPMediaItemPropertyArtwork: アートワーク, ] MPNowPlayingInfoCenter.default().nowPlayingInfo = info

20.

Now Playing対応 let info: [String: Any] = [ MPMediaItemPropertyArtist: アーティスト, MPNowPlayingInfoPropertyPlaybackRate: 再生速度, MPNowPlayingInfoPropertyElapsedPlaybackTime: 経過時間, MPMediaItemPropertyPlaybackDuration: 合計時間, MPMediaItemPropertyTitle: タイトル, MPMediaItemPropertyArtwork: アートワーク, ] MPNowPlayingInfoCenter.default().nowPlayingInfo = info

21.

CarPlay独自実装 • プロジェクト設定 • 再生アイテムへのナビゲーション • テンプレートに対してコンテンツを指定する形式

22.

プロジェクト設定 fi App ID Con guration

23.

プロジェクト設定 Entitlements.plist Info.plist

24.

ナビゲーション 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) } }

25.

一覧表示

26.

再生

27.

自作のアプリとともに 楽しいカーライフを🚗