ストリーミングはほとんどのブラウザと
Developerアプリで視聴できます。
-
CarPlayでAppの利用を増やそう
CarPlayなら、ドライブ中にiPhoneをスマートかつ安全に使用することができます。ここでは、CarPlayの最新のAppタイプを紹介します。CarPlay Simulatorにより、Appの開発やテストがデスクにいながら行えるようになる仕組みをご覧ください。また、ナビゲーションAppが、サポート対象車両のデジタルインストルメントクラスタと接続する仕組みについても解説します。
リソース
関連ビデオ
Tech Talks
WWDC23
WWDC20
WWDC18
-
ダウンロード
(軽快な音楽)
“CarPlayでAppの利用を増やそう”にようこそ 僕はAndré 本日のセッション担当者です
CarPlayなら iPhoneを車で スマートかつ安全に使えますね 本日は CarPlayでAppを 使用する方法について話します まずはサポートされるAppの タイプについて軽く確認し 今年 追加する新しいAppをいくつか取り上げて その後 Appの開発を サポートするために追加した 新ツールについて説明します 締めくくりはナビAppに特化した 新しい重要な機能を紹介します 前置きはこのぐらいで始めていきましょう!
CarPlayの基本的特性といえば 運転手のためだという事です Appを作る時には主要なユーザーは運転手だと 念頭に置きましょう つまり 運転中に関係する ユースケースのみを有効化し 運転中にしないようなユースケースは すべて排除すべきです 一度切りのコンフィグレーションや Appへのサインイン 利用規約の確認などは 運転の前後に行うべきであり Appの CarPlayのUIからは外されるべきです
CarPlayにAppを表示するには エンタイトルメントが必要です 作りたいAppのタイプに合わせ Apple CarPlay開発者用の ウェブサイトでエンタイトルメントを リクエストできます 現在サポートされている Appの種類はご覧の通りです 運転中に行うかなり多くの タスクをカバーしていますが 多くの方がさらに多くの運転関係Appの 有効化を望んでいると聞いています 嬉しいことに今年はここに 2つの新しいタイプが加わりました 燃料と運転タスクのAppです 後にこれらのタイプについて 詳細を説明しますが まずはテンプレートについて 簡単に見ていきましょう テンプレートは CarPlayでの AppのUIを表示します Appがデータを供給し システムが車両ディスプレイに UIを描いてくれるわけです このテンプレートのシステムは Appが採用しやすく 利点の例を挙げるとAppが運転中の使用に 適切になるよう誘導してくれる事です フォントサイズなどを心配する必要はなく UIが複雑にならないことを テンプレートが確実にしてくれて AppのUIは CarPlayの他のAppと調和して ユーザーが必要に応じて簡単に使えるわけです またスクリーンのサイズや 入力デバイスのタイプに関係なく CarPlayをサポートする すべての車においてAppが 問題なく機能するよう テンプレートが対処します 異なるコンフィグレーションでの Appのテストについては セッションのあとの方でお話しますが テンプレートが仕事の大半を してくれるのは確かです Appの作成時には 複数のテンプレートから選べます ボタンが配列された グリッドレイアウトのものから 表のついたリスト型のテンプレートまで デベロッパにも iOSユーザーにも 馴染みのあるものです CarPlayを使って運転するユーザーにとって 表示形式が馴染み深いのは非常に大切です 既に言いましたが CarPalyでは 様々なAppがサポートされ Appによってテンプレートの 関連性の度合いが異なります この図表で Appのタイプにより どのテンプレートが使用可能か 理解しやすいと思います なんだか DMV用の視力テストの ように見えますね 同じ図表がデベロッパ用オンライン ドキュメンテーションに出ています ここで覚えておきたいのは Appの使えるテンプレートは Appのタイプによる事です そのAppに関連する適切なテンプレートのみが 許可されるという事です テンプレートの話の次には iOS 16で新たに登場する Appのタイプについて詳しく見ていきます まずは 燃料補給のAppについてお話しましょう
iOS 14ではEV充電Appの サポートを開始しましたね EV充電器の場所を探すだけでなく 例えばユーザーを正しい充電スタンドに繋げ 充電を開始するなど他の機能があるのです こういった機能は電気自動車以外にも 非常に便利だという声が デベロッパから上がっています 従来のガソリン車であれ代替燃料車両であれ 燃料Appで CarPlayを サポートできる新カテゴリーです 場所を見つけて運転するだけなら 多くのユーザーは ナビAppを使っているので燃料Appは CarPlayのUIにそれ以上の機能を 備えている必要があります その例として挙げられるのは ガソリンポンプの始動ですね 次は 運転タスクのAppを見ていきましょう 運転タスクは CarPlay Appの新しいタイプで シンプルなAppを非常に多様にしてくれます これらのAppの主な目的は 運転中に必要なタスクを 可能にする事であって 単に運転中に何かのタスクを 行うためのものではありません
そのようなAppとして 考えられるものの例を挙げると アクセサリの制御を支援するAppや 運転状況、道路状況を提供するApp 運転の開始時および終了時の タスクを支援するAppです 具体的な例をいくつか見ていきましょう
まずは重要な道路情報を ユーザーに与えてくれる 道路状況に関するAppです このApp作成に使ったのは CPPointOfInterestTemplateです 繰り返しますが Appのユーザーは運転中なので ユーザーの現在地の近くに非常に短いリストを 表示するべきです これは運転前の完全なルート計画に使うための Appではありません
ユーザーが目的地を選ぶとこのようになります ご覧のように文字のスペースは 意図的に制限されており 一目で情報が分かるように 正確な言葉を選ぶ必要があります
次は車のアクセサリをコントロールするAppで… ここでは被けん引車のコントローラーです CPInformationTemplateを使って アクセサリの基本情報を提供し ユーザーが操作をするための ボタンも2つあります このAppの CarPlayでのUIは たったのこれだけです 他にスクリーンはありません! もちろんAppの機能は他にもたくさんあって 例えば 接続したアクセサリを 管理できる能力などですが 運転に必要でない機能はどんなものも Appの CarPlay UIには含まれていません ユーザーは車を降りてから 運転と関係のないタスクを iPhoneにあるAppの主要UIで行うべきです
CPGridTemplateを使った例を 2つほど見てみましょう これはボタンが2つしかない 究極にシンプルなAppです! ユーザーは個人走行距離か ビジネス走行距離として 走行距離の記録ができます 新しい運転タスクAppにぴったりなAppで ユーザーは運転中にすべきシンプルなタスクを 不要なタスクを一切 有効化せずに 行うことができます シンプルながら適切です このスタイルのUIは色んなタイプのAppに合い ほぼ同じUIを持つ別の例を見てみましょう これは CPGridTemplateを使った 高速有料道路応答機でAppで ユーザーが車内の乗車人数を 選べるようになっています 先程の例と全く同じ目的を果たしていて 運転タスクAppとして完璧だと言えます
まとめると運転タスクAppのデザインでは ユーザーが運転中に必要な 最低限の機能を提供する 1画面のみのAppの作成を考慮するべきで 瞬時に達成できるタスクのみを 有効化することです 複雑あるいは稀なユースケースは避けましょう つまり初期設定や詳細な コンフィグレーションなどです そして最後に運転に無関係な機能は たとえ車に関係していてもAppに加えません 何でもかんでも入れないことです 運転タスクAppについては以上です 今度は少し方向転換して CarPlay Appのテスト方法です 選べるいくつかの方法を見直してから CarPlay Simulatorという 新ツールにを紹介します デベロッパとして CarPlayで有効にしたAppを テストするツールがいくつかあります まずは Xcodeシミュレータが持つ 内蔵CarPlayウィンドウです 他のAppのテストに既に使っている場合は これで CarPlay UIも素早くテストできます また 現物の iPhoneでAppをテストするなら CarPlayのついた車両かアフターマーケットの ヘッドユニットに繋げられます 最近までは現物の iPhoneでAppの CarPlay UIを テストする方法はこれだけでしたが 3つ目の選択肢が気に入ると思いますよ CarPlay Simulatorです! これについてもう少し詳しく見てみましょう どういう物なのでしょうか? CarPlay Simulatorは スタンドアローンの Mac Appで CarPlay環境を再現します “Xcode用追加ツール”を Appleのデベロッパ向け ウェブサイトからダウンロードしてAppを実行し iPhoneをケーブルでMacに繋げるだけです CarPlayが iPhoneで起動し 本物の車に繋げた場合と 同じ様に作動します これを使おうと思うような特別な理由とは? 利点がいくつかあります
まず CarPlay Simulatorを使っていると 本物の車に繋げた時と同じ様に iPhoneでも実際に作動する事です つまり駐車場に行ったり来たりするとか アフターマーケットのヘッドユニットを 購入せずとも iPhoneでテストを行うことができるわけです もう1つの大きな利点は iPhoneが Macに繋がっているため CarPlay Simulatorを使いながら Macにある他の優れたツールを 同時に使う事ができるわけで Xcodeでのデバッグや Instrumentsの 性能チューニングなどもできます 同様に iOSの側から見てもiPhoneの機能全てに アクセスすることが できるという利点があります 実際の CarPlayシステムか CarPlay Simulatorがなければ テストできない状況もあります
分かりやすい例は FMラジオのような車側の音源と あなたのナビAppのガイダンス音声が 適切にミックスされるかテストする場合です これが今では デスク上で便利にテストできます
そして CarPlay Simulatorで複数の異なる車の コンフィグレーションもテストできます ディスプレイのサイズが異る車がその一例です 作動中の CarPlay Simulatorは どんな感じでしょうか ご覧ください iPhoneに繋がれたCarPlayのディスプレイが いくつかのコントロールと一緒に Appに表示されます その機能のいくつかを見ていきましょう スクリーンの下側には いくつかの異なるハードキーと 車のノブ型コントロールを 真似たボタンがあります
タッチスクリーン付き車両のように 直接 CarPlayビューを クリックする事もできます
上部にはいくつかの 簡易コントロールがあります スクリーン上の一定のコンテンツの制限を 走行中の車両が要求した場合を 再現できるボタンで 例えばオーディオAppのリスト内容の短縮化です
次の2つのボタンは UIとマップそれぞれのコンテンツの ダーク/ライトモードの変更を 車両が求めた場面を再現します
最後のボタンはiPhoneと CarPlayを 素早く切断および再接続する場面を再現します iPhoneはこの時もMacに繋がったままなので このボタンを使うとXcodeを使ってApp内のー CarPlay再接続シナリオをデバッグできます
さて とばした最初のボタンは何でしょうか? ご想像通りより高度な機能を表示する 二次ウィンドウのボタンです その高度な機能を見てみましょう
“一般”のタブで CarPlayのメインディスプレイの サイズを選ぶことができます AppのUIがテンプレートのみで 構成されている場合は 色々なサイズを試して 異なる車でのUIの見え方を 確かめられますが先ほども言ったように サイズに関わらずシステムが その動作を確実にします ですがナビAppの場合は 地図の描画が正しく行われるか確かめるために 色々なサイズやアスペクト比を 試すのは非常に重要です Appでのテストを奨励するサイズはこちらです クラスタ表示のタブを見てみましょう 計器クラスタにセカンドディスプレイを持つ 車を再現できるようになっていますね! チェックを入れて有効化し セッションをリスタートすると 計器クラスタ用の二次ウィンドウが 主要ディスプレイと一緒に表示されます 繰り返しますがナビApp関連です 計器クラスタディスプレイは マップか方向指示カードを 計器クラスタを目の前にする 運転手に表示するものです 計器クラスタに関してはこのあと もう少しお話しますが CarPlay Simulatorの簡単な説明は以上です その便利さが皆さんに伝わったでしょうか CarPlayが計器クラスタに ライブマップを描けるのは見ましたが 皆さんのナビAppはどうでしょうか? 計器クラスタのサポートを加えたり テストできますか? では 見てみましょう iOS 13の時に APIが加わり CarPlayダッシュボードに ナビAppが表示できるようになりましたね そのためにはAppのInfo.plistを編集し ダッシュボードのサポートを宣言し 必要なデリゲートを実装しました ダッシュボードへの表示の有無を デリゲートがAppに通知し UIWindowがAppに渡され マップの画描ができるわけです 簡単ですね 既にこれが実践済みなら 計器クラスタサポートの追加は 同様の手順なので 嬉しいことにとても簡単にできるのです 僕の試作ナビApp Space Roadsで どうやったかを見ましょう Info.plistを編集して 計器クラスタナビゲーションシーンの サポートを宣言し 要求された Scene Session Roleを追加しました その後 実装したのが CPTemplateApplicationInstrument ClusterSceneデリゲートと CPInstrumentClusterControllerデリゲートです どちらもコンテンツを描画する ウィンドウを渡し 計器クラスタの開始および終了を通知して 計器クラスタのビューを 見える状態にしてくれます これだけで車の計器クラスタに マップがライブで 表示されるようになります! ダッシュボードのサポートの 実装と似ていますが 計器クラスタに特化した注意点も少しあります まず 計器クラスタではマップの 拡大や縮小ができる事です Appにこれを実装するのを忘れずに CPInstrumentClusterController Delegatesを使いましょう 同様に Appにコンパス表示や 速度制限表示が含まれる場合 対応するデリゲートが その描画に適切な時をAppにおしえてくれます また 計器クラスタのビューは 車の計器クラスタにある 他の構成要素のせいで 不明瞭になる場合があります iOSの持つトップクラスの機能が これに対処してくれます… セーフエリアです! viewSafeAreaInsetsDidChangeを オーバーライドして セーフエリアが変更されたタイミングを知り クラスタビューでsafeAreaLayoutGuideを使い 見えることが保証されたエリアに 重要なコンテンツを維持します ユーザーの位置を示すのが 青いルートラインなら 重要な部分は必ずセーフエリアの中に 含まれるようにしましょう CarPlay Appを制作する デベロッパのための新機能や Appのテストに使う新ツールを見てきました 実際に使った様子を見てみましょう まず 僕の MacにあるCarPlay Simulatorです Appは実行中で今からiPhoneを繋げます
するとほらCarPlayが作動していますよ CarPlay SimulatorがAppを テストする様子を見てみましょう テンプレートベースのAppでも そのアートワークが ライトモード、ダークモードの両方で 正しく見えるか確認できます Express Lane Appを実行して…
ツールバーのボタンを使い 表示モードを切り替えられます このAppではそれぞれ 違うアートワークになっていますね いい感じです では僕が書いたナビAppの試作 Space Roadsを見ましょう
メインの設定パネルを使って 異なるスクリーンサイズで マップ描画コードを試します
そして計器のクラスタ表示を有効化し 計器クラスタサポートをテストします
問題ありません! 先ほどこのAppを CarPlay Simulatorでテストしたので 実際の車でも問題なく 作動すると自信が持てます やってみますよ! さあ 僕の車の中でご覧のようにiPhoneが 車に繋げられてCarPlayを実行しています
まずは 被けん引車コントローラー Appを実行してみて テンプレートベースのAppでもノブ対応車両で 作動する事をお見せします
この車はタッチパネルと ノブコントローラーがありますが 運転中はノブの方を好むユーザーが多いので ノブを使ってAppが機能することが大切です ご覧のようにAppの 全てのボタンにアクセス可能で 何が最高かと言えば僕が何もせずとも テンプレートが全てやってくれた事です!
次にナビAppのSpace Roadsに切り替えます Appを起動し… ナビゲーションを開始し… “出発”を押します ジャーン! Appがライブマップをセンターコンソールと 計器クラスタの両方に表示します! 運転手から見やすい位置の ライブマップは最高です 皆さんのナビAppを使う方々も きっと気にいると思います では 本日はこれまでです さらなる詳細は CarPlayの デベロッパ用ポータル developer.apple.com/CarPlayでご覧ください ご清聴ありがとうございました!
-
-
15:43 - Application scene manifest
<key>UIApplicationSceneManifest</key> <dict> <!-- Indicate support for CarPlay dashboard --> <key>CPSupportsDashboardNavigationScene</key> <true/> <!-- Indicate support for instrument cluster displays --> <key>CPSupportsInstrumentClusterNavigationScene</key> <true/> <!-- Indicate support for multiple scenes --> <key>UIApplicationSupportsMultipleScenes</key> <true/> <key>UISceneConfigurations</key> <dict> <!-- For device scenes --> <key>UIWindowSceneSessionRoleApplication</key> <array> <dict> <key>UISceneClassName</key> <string>UIWindowScene</string> <key>UISceneConfigurationName</key> <string>Phone</string> <key>UISceneDelegateClassName</key> <string>MyAppWindowSceneDelegate</string> </dict> </array> <!-- For the main CarPlay scene --> <key>CPTemplateApplicationSceneSessionRoleApplication</key> <array> <dict> <key>UISceneClassName</key> <string>CPTemplateApplicationScene</string> <key>UISceneConfigurationName</key> <string>CarPlay</string> <key>UISceneDelegateClassName</key> <string>MyAppCarPlaySceneDelegate</string> </dict> </array> <!-- For the CarPlay Dashboard scene --> <key>CPTemplateApplicationDashboardSceneSessionRoleApplication</key> <array> <dict> <key>UISceneClassName</key> <string>CPTemplateApplicationDashboardScene</string> <key>UISceneConfigurationName</key> <string>CarPlay-Dashboard</string> <key>UISceneDelegateClassName</key> <string>MyAppCarPlayDashboardSceneDelegate</string> </dict> </array> <!-- For the CarPlay instrument cluster scene --> <key>CPTemplateApplicationInstrumentClusterSceneSessionRoleApplication</key> <array> <dict> <key>UISceneClassName</key> <string>CPTemplateApplicationInstrumentClusterScene</string> <key>UISceneConfigurationName</key> <string>CarPlay-Instrument-Cluster</string> <key>UISceneDelegateClassName</key> <string>MyAppCarPlayInstrumentClusterSceneDelegate</string> </dict> </array> </dict> </dict>
-
16:00 - Application instrument cluster scene delegate
extension TemplateApplicationSceneDelegate: CPTemplateApplicationInstrumentClusterSceneDelegate { func templateApplicationInstrumentClusterScene( _ templateApplicationInstrumentClusterScene: CPTemplateApplicationInstrumentClusterScene, didConnect instrumentClusterController: CPInstrumentClusterController) { // Connected to Instrument Cluster TemplateManager.shared.clusterController(instrumentClusterController, didConnectWith: templateApplicationInstrumentClusterScene.contentStyle) } … func instrumentClusterControllerDidConnect(_ instrumentClusterWindow: UIWindow) { // Window in which to draw instrument cluster contents self.instrumentClusterWindow = instrumentClusterWindow }
-
-
特定のトピックをお探しの場合は、上にトピックを入力すると、関連するトピックにすばやく移動できます。
クエリの送信中にエラーが発生しました。インターネット接続を確認して、もう一度お試しください。