見出し画像

Apple CarPlayで広がる『カーナビタイム』の進化

こんにちは、はちべーです。ナビタイムジャパンで『カーナビタイム』などカーナビ系アプリのマネジメントとiOSアプリの開発を担当しています。
この記事では、『カーナビタイム』がこれまでどのようにCarPlayに対応して、進化してきたかをご紹介いたします。

と、その前に、まずは『カーナビタイム』をご存知ない方に説明させてください。

『カーナビタイム』とは

当社が App Store と Google Play ストアで提供している、カーナビアプリになります。以下のサイトでも紹介していますが、

主な特徴としては以下になります。

  1. 通信圏外でもルート検索・音声案内が可能

  2. AIを活用して、ドライバーの好みに合わせたルートが出せる

  3. 抜け道を利用した渋滞回避ルートを案内

  4. トラックやタクシー、配達ドライバーにも便利なプロ向け機能

Apple CarPlayとは

では、本題のCarPlayですが、聞いたことない方もいらっしゃると思いますので、こちらも紹介します。
Appleが紹介しているCarPlayのサイトでは以下のように説明されています。

運転中にiPhoneを使うための、より優れた、より安全な方法。それがCarPlayです。行き方を調べる。電話をかける。メッセージを送受信する。大好きな音楽を楽しむ。すべて車載ディスプレイでどうぞ。

『カーナビタイム』が対応しているCarPlayはその一部となりますが、開発者向けのプログラミングガイドでは、CarPlayがサポートするアプリは以下のいずれかのカテゴリになります。

1. Audio
2. Communication (messaging and calling)
3. Driving task
4. EV charging
5. Fueling
6. Navigation (turn-by-turn directions)
7. Parking
8. Quick food ordering

CarPlay App Programming Guide

『カーナビタイム』はこのうち「6. Navigation (turn-by-turn directions)」として、CarPlayでのナビゲーション機能を実現しています。

なぜCarPlayに対応したのか

まずその根底にあるのは、『カーナビタイム』をあらゆるドライバーに使っていただいて、安心・安全なドライブをしていただきたい、そのような思いがあります。
そのために、車載カーナビの大画面で『カーナビタイム』を使っていただく、というのはそれを実現する手段の1つになります。
過去にも当社では、カーナビアプリを車載カーナビと連携するために、以下のような取り組みを行ったこともあります。

そのような中で、これまでカーメーカーでしか利用できなかったCarPlayが、2018年に当社のようなアプリ提供者も利用できるようになりました。
ここで、これまでの車載カーナビ連携と違ってCarPlayに対応することのメリットを2点紹介します。

1. ドライバーが見やすくて、操作しやすいUI

例えば、ナビ画面は以下のようにシンプルでわかりやすいレイアウトになっています。

CarPlay App Programming Guide「Show trip information and upcoming maneuvers」

もちろん、これはApple純正のマップアプリでも同様の表示となるため、これまでそのマップアプリでナビを使っていたドライバーが『カーナビタイム』でCarPlayを使っても、同じようにナビ画面を使うことができます。

2. 開発しやすいフレームワーク

フレームワークで提供されているAPIを用いることで、CarPlayとの接続、ナビ画面の表示、ボタン操作、など、簡単に実装することができます。
ここで、実際にアプリをCarPlayに対応するための実装方法について、簡単に紹介します。

CarPlayに対応するには

プログラミングガイドにも書かれている通り、まずはInfo.plistに以下を追加します。

<key>UIApplicationSceneManifest</key>
<dict>
    <key>UISceneConfigurations</key>
    <dict>
        <!-- Declare device scene -->
        <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>
        <!-- Declare CarPlay scene -->
        <key>CPTemplateApplicationSceneSessionRoleApplication</key>
        <array>
            <dict>
                <key>UISceneClassName</key>
                <string>CPTemplateApplicationScene</string>
                <key>UISceneConfigurationName</key>
                <string>MyApp-Car</string>
                <key>UISceneDelegateClassName</key>
                <string>MyApp.CarPlaySceneDelegate</string>
            </dict>
        </array>
    </dict>
</dict>

これによって、iPhoneの画面とCarPlayの画面で2つのsceneを宣言します。この設定によって、CarPlayに接続するとCarPlaySceneDelegateに接続通知が呼ばれます。この通知で受け取ったCPInterfaceControllerを用いて、CarPlayの画面で使われる全てのtemplateを管理します。
以下の例では、リストを表示するためのCPListTemplateをrootに設定していますが、ナビアプリのように地図を表示する場合は、これがCPMapTemplateになります。

import CarPlay

class CarPlaySceneDelegate: UIResponder, CPTemplateApplicationSceneDelegate {
    var interfaceController: CPInterfaceController?

    // CarPlay connected

    func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene,
                                  didConnect interfaceController: CPInterfaceController) {
        self.interfaceController = interfaceController
        let listTemplate: CPListTemplate = ...
        interfaceController.setRootTemplate(listTemplate, animated: true)
    }

    // CarPlay disconnected

    func templateApplicationScene(_ templateApplicationScene: CPTemplateApplicationScene,
                                  didDisconnect interfaceController: CPInterfaceController) {
        self.interfaceController = nil
    }
}

実装としては上記が基本となりますが、実はこれだけでは接続時の通知が呼ばれません。もう1つ実装以外で必要なことがありますので紹介します。

実装以外に必要なこと

プログラミングガイドにも書かれていますが、entitlementというものを取得する必要があります。

If your app meets the criteria for a CarPlay app, Apple will assign a CarPlay app entitlement to your Apple Developer account and notify you.

CarPlay App Programming Guide「CarPlay app entitlements」

直訳すると「アプリがCarPlayアプリの基準を満たす場合、AppleはあなたのApple DeveloperアカウントにCarPlayアプリの権利を割り当て、あなたに知らせます。」ということで、Apple Developer Program からこの申請が必要になります。
ただ、この「CarPlayアプリの基準」、プログラミングガイドに細かく書かれているのですが、例えばその1つに「All CarPlay user flows must be possible without interacting with iPhone.」つまり「CarPlayのすべてのユーザーフローが、iPhoneとのインタラクションなしに可能であること。」と書かれていますが、これはCarPlayでの動作となっており、entitlementを取得する時点ではもちろんCarPlayに対応したアプリではないので、どのような基準でその申請が通るのかはよくわかっていません。

CarPlayでできないこと

また、実装する上で考慮しなくてはいけないのが、これまでiPhoneではできていたことが、CarPlayのUIでは実現できないことが多々あります。
これは、車での利用を想定して、ドライバーに安全に使っていただくためにAppleが用意したUIに限定されるためです。
CarPlayを「Navigation (turn-by-turn directions)」として利用する場合、画面に表示する地図は自由に表現できますが、ナビ画面は上で載せた画像のように、フレームワークで決められたレイアウトなので、iPhone側でのナビ画面と同じ見せ方をすることはできません。例えば『カーナビタイム』では以下の画面のように、高速走行時のIC/SAPAリストや制限速度、走行中の道路や現在地住所など、ナビとして重要な情報が、CarPlayで用意されたUIでは表示できません。

iPhone:高速走行時の表示

また、『カーナビタイム』ではルート検索結果で最大8つのルートから選択することができますが、CarPlayでは3つまでしかルートを選択できませんし、ルートの詳細な情報(どの交差点で曲がるかや、どこで高速に乗るかなど)を表示することもできません。

CarPlay App Programming Guide「Route choice panel」

CarPlayでしてはいけないこと

さらに、Appleは「Human Interface Guidelines」で実装やデザインなどについて、どのように選択すればユーザーが簡単にコンテンツや機能を使えるようになるのかを定義しています。その中でCarPlay利用中のiPhoneの操作については以下のように書かれています。

Eliminate app interactions on iPhone when CarPlay is active.

Human Interface Guidelines - Technologies - CarPlay - Interaction

直訳すると「CarPlayがアクティブなときにiPhone上のアプリのインタラクションをなくす。」です。
ドライバーとしては、CarPlayを使いながらiPhone側でもアプリを使用したくなるケースもあると思いますが、ガイドラインではそれが禁止されています。これを守るために『カーナビタイム』ではナビ中のiPhoneでの表示を以下のように案内地点のリスト表示にすることにしています。
ユーザーとしてはナビ中でもiPhoneを操作したくなりますが、ここは安全面を優先して、Appleのガイドラインを遵守しています。

iPhone:案内リスト表示

このようなフレームワークの仕様やガイドラインを満たしながら、2018年9月にiOS12が公開されたと同時に『カーナビタイム』もCarPlay対応をリリースしました。

Appleにもこれを認められ、CarPlayの公式サイトでもおすすめのアプリとして『カーナビタイム』が紹介されています。

ただ、これだけでは本来の『カーナビタイム』の機能が十分に活かされていないため、以下で紹介するような改善を進めてまいりました。

CarPlayでの『カーナビタイム』の進化

まず最初に、どうしても対応が不可欠であった、案内画像の表示です。
日本では複雑な交差点が多く、曲がる方向だけでの案内では間違った方向へ進んでしまうなど、ドライバーとしては非常に不安だったり、危険な思いをします。
そこで当社ではAppleへ画像も表示できるようにしてもらいたい、と直接要望を出したところ、約半年後に交差点画像の表示に対応していただけました。

CarPlay:案内画像表示

当社からの要望ということもあって、この機能で案内画像を表示したアプリは『カーナビタイム』が世界初だと、Appleの担当者からも言われました。これによって、CarPlayでのナビが非常にわかりやすいものになりました。

また、この画像表示を活かすことで、先にも述べた高速走行時のIC/SAPAリスト表示にも対応しました。

CarPlay:交差点画像表示機能を用いたIC/SAPAリスト表示

iPhoneでの表示に比べると、まだ十分な情報を表示することはできていませんが、ジャンクションのみの案内に比べると、格段に安心感のある案内にすることができました。
他にも、『カーナビタイム』にある便利な機能も次々とCarPlayで利用できるようにしています。以下はその一部です。

さらに、CarPlay利用中にiPhoneの操作を控えるようガイドラインに書かれていましたが、カメラとして利用するだけであれば操作は不要なため、これをドライブレコーダーとして利用することにしました。
以下がその利用イメージです。

CarPlayではナビ画面、iPhoneではカメラでドライブレコーダーを録画

ただ、ドライバーが求めているのはやはりナビの情報で、CarPlayのUIがこのようになっているからこれ以上の情報を表示できない、というのはこちらの都合でしかなく、ユーザーからのご意見でも「もっと情報を表示してほしい」という声が多数届きました。
そこで、ご要望の多かった以下の2つの情報については、地図画面に表示することで対応しました。

ただ、CarPlayのUIはAppleがドライバーの安全を考慮して作られたものなので、安全面とユーザーのご要望を両立しながら、常に安心・安全でより使いやすいナビを提供できるよう努めております。
ですので、iPhone側で取り入れた機能も、極力CarPlayでも利用できるようにしております。

今後も『カーナビタイム』はCarPlayでも進化してまいりますので、もしお車のカーナビがCarPlayに対応していましたら、是非これを機にお試しいただければと思います。