ナビゲーション機能をSDKにしたお話
こんにちは、ザクザクとカップMENです。ナビタイムジャパンでザクザクは研究開発部門でナビゲーションの案内開発を、カップMENはソリューション事業にて、プロダクトの開発を担当しています。
今回は、『NAVITIME SDK』の機能と特徴の紹介、開発に至った経緯や工夫などのをお話したいと思います。
『NAVITIME SDK』とは
『NAVITIME SDK』とは、当社のカーナビゲーションアプリ(ドライブサポーター、カーナビタイム、ツーリングサポーター)と同等レベルの機能を持ったAndroid OS/iOSアプリを作成するためのソフトウェア開発キットです。
開発できる機能は多岐にわたり、より自由度の高いナビゲーションアプリの作成が可能です。
こちらは、Android OSやiOS向けのナビを一から作成するための開発キットとなっており、自由にナビゲーションアプリを構成することが可能ですが、各プラットフォームごとのアプリ開発の知識が必要となるプロダクトとなっています。
(各プラットフォームごとのアプリ開発の知識を持ち合わせていない場合や、開発コストをかけられない場合のプロダクトも別にあり、「WebNAVI」というのもあります。)
『NAVITIME SDK』の主な機能
『NAVITIME SDK』には、ナビゲーションアプリを開発するのに必要な機能が全て入っています。
地図
地図の表示だけでなく、線や矩形、円などの図形表示、昼夜で地図の見た目を変えるなどができます。
航法
端末内蔵GPSを使用して実際に走っている道路にマッチングします。
ルート検索
出発地から目的地までの優先条件であったりその他指定された条件に合わせた最適なルートを検索します。
案内
ルート上の自位置に応じた音声による案内発話であったり、目的地までの距離などの案内に必要な情報を出力します。
『NAVITIME SDK』を導入することで、当社のナビゲーションアプリと同等のことが実現できます。
『NAVITIME SDK』の特徴
『NAVITIME SDK』は、アプリケーションに組み込むことで自由にナビゲーションアプリを開発することができる点が特徴です。
『NAVITIME SDK』は、地図以外のUIはありません。
そのため、地図画面の配置やガイド情報の配置、地図上に表示するボタンの種類など、ほぼすべてのUIのカスタマイズが行えます。
また、ナビ画面の見やすさの追求/操作のしやすいボタン配置といった様々な要望/需要に沿った最適なUI・UXの実現といった、こだわったデザインカスタマイズが可能となっています。
UI以外にも、案内中に発話する内容のOn/Offも行うことが可能であったり、任意の言葉を発話することが可能です。
導入いただいている企業様からも、このカスタマイズ性を評価していただいています。
なぜ、『NAVITIME SDK』をプロダクト化したのか
当社のナビゲーションアプリは、2003年に今でいうガラケー向けに徒歩ナビゲーションを提供したことから始まります。
その後、車向けのナビゲーションアプリを提供し進化していきました。
プロダクト化のきっかけは、2007年にスマホが登場し、2012年には3Gから4Gに変わったことで、それまでシンプルだったUIから表現がリッチなUIへと移り変わり、コンテンツの充実化していく流れへと変わりました。
ガラケー時代は、各アプリケーションでコンテンツとナビゲーション機能の両方を開発していましたが、ナビゲーション機能の開発を分離し独立させることで、ユーザーに必要な多くのコンテンツとナビゲーション機能の提供ができる体制作りを行いました。
ナビゲーション機能の開発は、徒歩、車など移動体に関わらず共通化することで横展しやすい形とするべく、コンポーネント化することから始めました。
コンポーネント化したのは、先述でナビゲーションに必要な機能の地図、航法、ルート検索、案内になります。
コンポーネント化することで、アプリケーションが共通で組み込むことができましたが、ナビゲーション機能が進化していくことで課題が見えてきました。
それは、機能の充実化していくことで、各コンポーネントのI/Fも増えつなぎ合わせが複雑化していき、導入側の処理が多くなったことでナビゲーション機能の開発効率が徐々に下がっていきました。
これでは、当初の目的からズレてしまうため、解決するために地図以外のコンポーネントの上位に中間層を置き、導入側で処理していたつなぎ合わせのロジックをもたせることで、ナビゲーション機能を実現するのに必要なコード量を削減することができました。
この構成が出来上がったことで、極力少ない実装コストで且つ自由にナビゲーション機能の導入が可能になると考えプロダクト化しました。
開発に工夫したところ
ここからは、開発で工夫したところをお話していきます。
1つ目は、マルチプラットフォーム対応です。
当社のナビゲーションアプリは、iOSとAndroid OSの2プラットフォームに提供しています。
ナビゲーション機能をコンポーネント化する際は、当然両プラットフォーム対応する必要があります。
それぞれのプラットフォームで対応された言語の、iOSのObjective-C、SwiftやAndroid OSのJava、Kotlinで対応するとなると開発、運用コストが単純に2倍になります。
両プラットフォームの開発を経験された方ならこれをどう解決するかは簡単に思いつくと思います。
両プラットフォームは、C++を利用することができるのでこれを活用します。
そのため、地図、航法、ルート検索、案内のそれぞれでOSに依存しない共通処理をC++で実装することで、開発、運用コストを極力下げる工夫を行いました。
2つ目は、利用者する側の目線にたったI/Fと導入するコストの意識です。
ナビゲーションは、ルートに沿った案内をするものですが、その流れは位置情報をOSから取得して、それを元にその場所に必要な案内の情報を構築し、さらに音声での案内が必要な場合、音声ファイルの再生をOSに要求するなど、多くの処理が必要となります。
先述でお話しましたが、中間層を作ったことになり、OSとコンポーネント間のつなぎこみを導入側が必要なくなったので導入コストを下げています。
また、I/Fも何かを実行したい場合にいろいろなクラスに分けるのではなく、1つのクラスで完結するように作りもしています。
なので、この1クラスにどういったI/Fがあるか把握することでナビゲーション機能を実現するのも容易になります。
おわりに
『NAVITIME SDK』は、ナビゲーション機能を少しでも短い時間で実現できるよう意識してプロダクト化しています。
『NAVITIME SDK』は、新規にナビゲーションサービスを導入したい、既存サービスにナビゲーション機能を追加したいといったニーズの手助けになればと思っております。
今の形が最適解では無いかもしれませんが、今後も引き続きブラッシュアップを行い、ナビゲーション機能を実現をもっと容易にできればと考えております。
最後までお読みいただきありがとうございます。
ご興味がある方は、『NAVITIME SDK』をお試しいただければと思います!