ガイド変更履歴HERE SDK API references
ガイド

スコープを設定して複数のアプリを区別する

このセクションでは、アプリの資格情報とプロジェクトスコープの相関関係について説明します。

スコープは必ずしも必要ではありません。

  • HERE SDK を使用して 1 つのアプリのみを開発する場合は、HERE プラットフォームにあるプロジェクト マネージャーを使用する必要はありません。その場合、次のセクションはスキップできます。

  • 複数のアプリを開発する場合は、同じ資格情報セットを再利用する必要があります。各アプリの統計を個別に確認できるようにするには、スコープを設定する必要があります。次のセクションを必ずお読みください。

プロジェクト スコープは、特定の開発プロジェクトに対する具体的なサービスを明確にするために使用されます。スコープを設定すると、特に定義されているものを除き、他のすべての HERE サービスにアクセスできなくなります。通常、HERE SDK を使用してアプリを 1 つ開発する場合は、1 つのアプリに対して 1 つの資格情報セットを使用するだけで十分です。この場合もプロジェクト スコープの設定は不要です。その場合、このセクションは必要ありません。

HERE SDK を使用して複数の異なるアプリを開発するために 1 つの資格情報セットを使用する場合は、以下をお読みください。

HERE プラットフォームはプロジェクトをサポートしています。これにより、開発者はアプリを管理し、アプリのアクセス権とその利用権限をさらに制限およびカスタマイズできます。これは、HERE プラットフォームにログインしたときに表示されるプロジェクト マネージャーを使用して行います。プロジェクトの設定方法の詳細については、IAM ガイドを参照してください。

さらに、プロジェクト マネージャーを介してプロジェクトを使用してアプリを設定すると、ダウンロードされた使用状況レポートでアプリを参照できます。これにより appId に加え、プロジェクトの HRN 値に基づいて、アプリの背後にある使用状況の統計情報を区別できます。HERE Resource Name (HRN) は、カタログ、スキーマ、パイプライン リソース、プラットフォーム プロジェクト、アプリの一意の識別子です。リソース、プロジェクト、アプリが作成されると HERE プラットフォームで HRN が自動生成され、変更することはできません。HRN を使用することで、HERE プラットフォームへのリクエストのプロジェクト スコープを指定できます (使用状況の追跡を改善するために推奨されています)。

その他のユースケースとしては、たとえば、ステージング アプリをテストするためのデバッグ スコープや、最終アプリの本番スコープを定義することがあげられます。

HERE アカウントには、モバイル アプリケーションに関係しないアプリ セクションもあります。ここでは、このアプリ セクションは無視して構いません。後述するとおり、プロジェクト マネージャーは構築する予定のモバイル アプリケーションに属するプロジェクトを設定するためにのみ必要であるためです。

デフォルトでは、プロジェクトマネージャーを使用してプロジェクトを作成する場合、関連付けられているアプリにサービスおよび (ライセンスによっては) マップカタログを設定して、HERE SDKから使用する予定の関連APIを有効にする必要があります。

これを行わないと、アプリはデフォルトのプロジェクト設定を使用し、HERE SDKで行われた一部のリクエストには、アクセス権が付与されていないというエラーメッセージが返されます。403: Not authorized to access the resources のようなエラーがログに表示される場合があり、実行される個々のエンジンに応じて、HERE SDK はエラー列挙値を返します。

必要な HERE サービスを設定する方法

  1. お使いの platform.HERE.com アカウントにログインします。
  2. ランチャーのメニューを開き、[管理]、[プロジェクト マネージャー] の順に選択します。次にプロジェクトを作成し、プロジェクトの HRN 文字列をコピーします。これは後で使用します。[プロジェクト マネージャー] では、複数のプロジェクト/アプリを定義できます。各プロジェクト/アプリは、一意の HRN を介して識別されます。例:hrn:here:authorization::olp-here-sdk-navigate:project/abcd123"。実際の値は、プロジェクト/アプリに対して一意となります。
  3. プロジェクト設定で、HERE SDK に必要なバックエンド サービスを指定します ([リソース] -> [サービス] -> [サービスをリンク])。

必要なサービスの一覧

  • HERE Isoline Routing
  • HERE Network Positioning
  • HERE Raster Tile
  • HERE Routing
  • HERE Routing - Transit
  • HERE Search - Autosuggest
  • HERE Search - Browse
  • HERE Search - Forward Geocoder
  • HERE Search - One Box Search
  • HERE Search - Place ID Lookup
  • HERE Search - Reverse Geocoder
  • HERE Search - Traffic API
  • HERE Vector Tile
  • HERE Vector Tile - Traffic

必要なカタログ (Navigateにのみ適用)

HERE SDK (Navigate) の場合はカタログも指定する必要があります。デフォルトでは、これはOCMカタログです。HERE SDK (Navigate) を使用している場合は、プラットフォームアカウントにはこのカタログへのアクセス権が必要です。

以下のスクリーンショットに示すように、「Optimized Client Map」カタログを選択してリンクします ([リソース] -> [カタログ] -> [カタログを追加] -> [カタログをリンク])。

Screenshot: Link the default catalog.

OCMカタログは一意のHRN文字列 ("hrn:here:data::olp-here:ocm"でも特定できますが、「Optimized Client Map」と入力するとすぐに表示されます。表示されない場合は、HERE担当者にお問い合わせください。

OCMパッチカタログ (ocm-patch) の手順を繰り返し、必要に応じて日本向け (ocm-japan) にも実行します。この手動手順はスコープを設定する場合にのみ必要になります。デフォルトではこれは自動的に制御されます。

アプリでスコープを設定する

次のステップとして、アプリにプロジェクト スコープをプログラムによって設定します。このステップでは、先ほどコピーしたプロジェクトの HRN 文字列を使用します。例:「hrn:here:authorization::olp-here-sdk-navigate:project/abcd123」。実際の値は、プロジェクト/アプリに対して一意となります。

HERE SDK を初期化する前に、プロジェクトの一意の HRN 値をスコープとして設定します。

sdkOptions.scope = "YOUR_PROJECT_HRN";

以下のスクリーンショットは、プロジェクト ID と結果として得た HRN 値が表示されたサンプル プロジェクトを示しています。

Screenshot: Find the HRN for your project.

なお、プロジェクト ID は一意である必要があり、組織のアカウントの存続期間中に変更することはできません。スクリーンショットで確認できるとおり、HRN 値にも影響します。スコープ/HRN がアプリケーションによって設定されている場合は、アプリケーションの認証および内部トークンの作成に使用されます。

未知のスコープが設定されている場合、認証の試行は失敗し、アプリケーションのログにそのことが示されます。

詳細については、IAM ガイドを参照してください。これにはプロジェクトの管理に関する情報も含まれています。


EN 日本語

HERE documentation

Find answers to your product and technical questions

Documentation

What's new

Videos

EN 日本語

HERE ドキュメント

製品や技術に関する質問の答えを見つけましょう。より多くの内容と最新の情報については、英語版をご覧ください。

ドキュメント

ダイナミックマップ

動的コンテンツ関連のAPIをアプリやサービスに活用して、ドライバーが安全・快適かつ予定どおりに目的地へ到着できるよう支援します。

地図とデータ

世界中を走行する多数のマッピング車両から得られる最新の位置情報データを活用し、精度の高い地図やカスタムレイヤーを構築できます。

最新情報

動画

(function () { const input = document.querySelector('input[data-typeahead]'); if (!input) return; // Prevent the form from submitting/navigating input.closest('form')?.addEventListener('submit', e => e.preventDefault()); input.addEventListener('input', function () { const q = this.value.trim().toLowerCase(); document.querySelectorAll('.nav-group-name').forEach(group => { let anyVisible = false; group.querySelectorAll('.nav-group-task').forEach(task => { const text = task.textContent.trim().toLowerCase(); const show = !q || text.includes(q); task.style.display = show ? '' : 'none'; if (show) anyVisible = true; }); // Hide the whole group header if nothing matches group.style.display = anyVisible || !q ? '' : 'none'; }); }); })(); (function () { function onTokenClick(event) { var link = event.target.closest('.sdk-for-ios .item .token'); if (!link) return; event.preventDefault(); console.log('token clicked', link.textContent.trim()); var item = link.closest('.item'); if (!item) return; var content = item.querySelector('.height-container'); if (!content) { console.log('no .height-container found for item', item); return; } var isHidden = window.getComputedStyle(content).display === 'none'; content.style.display = isHidden ? 'block' : 'none'; link.classList.toggle('token-open', isHidden); var href = link.getAttribute('href'); if (href) { if (history.pushState) history.pushState({}, '', href); else location.hash = href; } } function openHashTarget() { var hash = window.location.hash.slice(1); if (!hash) return; var anchor = document.querySelector('.sdk-for-ios a[name="' + hash + '"]'); if (!anchor) return; var item = anchor.closest('.item'); if (!item) return; var link = item.querySelector('.token'); var content = item.querySelector('.height-container'); if (!link || !content) return; content.style.display = 'block'; link.classList.add('token-open'); } function init() { console.log('HERE SDK accordion init'); openHashTarget(); } document.removeEventListener('click', onTokenClick); document.addEventListener('click', onTokenClick); if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', init); } else { init(); } window.addEventListener('hashchange', openHashTarget); window.addEventListener('pageLoad', init); })();