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

デバッグとトラブルシューティング

このセクションでは、効果的なデバッグとトラブルシューティングのテクニック、一般的な問題、洞察に富んだログの生成方法について説明します。

一般的な問題

問題が発生した場合は、まず最小要件サポートされるデバイスChangeLogに掲載されている既知の問題のリストを確認してください。

  • **空白の白いマップのみが表示されます。**ご利用のHERE Credentialsが有効で、「利用開始」セクションの説明に従って設定されていることを確認してください。また、ご利用のデバイスがインターネットに接続できることを確認してください。インターネット接続が遅い場合、最初に読み込まれたマップ タイルが表示されるまでにしばらくかかることがあります。また、デバイスの時刻が正しく設定されていることを確認してください。まれに、デバイスの時間が正しく設定されていないと、一部のバックエンド サービスで認証の問題が発生する可能性があります。

  • **ログに "No map content will be displayed until valid config is provided." と表示される:**コードで実際に loadScene() を呼び出していることを確認してください。

  • XcodeでMapViewが不明というエラーが発生しました。利用開始」セクションで説明されているように、HERE SDKフレームワークを統合してください。

  • **Xcodeでheresdkのモジュール定義がロードされません。**これはrdar://42087654として知られているXcode SourceKitエラーです。「利用開始」セクションで説明されているように、HERE SDKフレームワークを統合してください。また、プロジェクトおよびフレームワークへのパスにスペース記号が含まれていないことを確認してください。

  • **Xcode でシミュレーター用のプロジェクトがコンパイルされません。M1 チップを搭載したコンピューターを使用しています。**4.9.2.0 よりも前の HERE SDK バージョンを使用しています。新しい HERE SDK バージョンを使用するか、Xcode 内の Build Settings/Architectures/Excluded Architectures/Debug 設定で [Any iOS Simulator SDK](任意の iOS シミュレーター SDK) の ARM64 アーキテクチャを除外して Rosetta モードで実行してみてください。[TARGETS](ターゲット) 設定でこのオプションを選択します。この場合シミュレーターを実行すると、パフォーマンスがわずかに低下することがあります。

  • マップが表示されないか、HERE SDK が何も呼び出しません。"These credentials do not authorize access" というログ メッセージが表示された場合は、資格情報が有効ではありません。有効な資格情報を使用していることを確認してください。3.xバージョンの資格情報には互換性がありません。Exploreの資格情報はNavigateと互換性がありません。

  • **iOSリリース用に構築すると、構築が失敗します。**ログに -embed-bitcode の実行が記録されている場合は、ビットコードの最適化を明示的に無効にしてください。Apple はビットコードを廃止したため、現在 HERE SDK ではビットコードをサポートしていません。デバッグとリリースの Xcode 構築設定に ENABLE_BITCODE = NO; を追加します。

  • Xcode で [Archive](アーカイブ) オプションがグレー表示になっているか、無効になっています。[Archive](アーカイブ) オプションが無効になっている最も一般的な理由は、アクティブなスキームとしてシミュレーターが選択されていることです。物理デバイスがあるか、アクティブなスキーム ドロップダウン メニューで [Generic iOS Device](一般的な iOS デバイス) オプションが選択されていることを確認します。もう 1 つの原因として、ワークスペースの設定に誤りがある可能性があります。プロジェクト ナビゲーターでワークスペースをクリックし、[Edit Scheme](スキームを編集) をクリックします。[Build](構築) タブで、ターゲットの [Archive](アーカイブ) チェックボックスがオンになっていることを確認します。

  • **大規模な更新やストレージの急増を避けてオフラインマップを管理するには、**ナビゲートライセンスを使用する場合、MapDownloaderでインストール済みのRegionsをクエリし、ダウンロード済みリージョンを監視し、更新サイズを見積もり、不必要なダウンロードを避けます。更新をトリガーする前に、既存のリージョンサイズを比較します。より細かく制御する場合は、自動更新を無効にします。詳細については、こちらを参照してください。

ログレベルで指定する

LogControl クラスでは、アプリのリリース ビルドであっても、事前定義されたさまざまな LogLevel 値の HERE SDK メッセージをログに記録できます。LogControl は必ず HERE SDK を初期化する前に呼び出してください。

// Disable any logs from HERE SDK.
// Make sure to call this before initializing the HERE SDK.
LogControl.disableLoggingToConsole()

上のコマンドにより、HERE SDK 関連のすべてのコンソール ログを無効化できます。なお、問題を調査する際に重要となるログメッセージが失われる可能性があるため、デバッグ ビルドではこれはお勧めしません。

ログ レベルは次のように指定できます。

LogControl.enableLoggingToConsole(LogLevel.logLevelInfo)

LogLevel を指定する場合、以下の階層に基づいて、報告されるメッセージの最小レベルを設定します。

  1. logLevelInfo
  2. logLevelWarning
  3. logLevelError
  4. logLevelFatal

たとえば、logLevelError を設定する場合、logLevelInfo および logLevelWarning はログから除外されます。その他はすべてログに記録されます。

logLevelOffを設定すると、すべてのログが記録されなくなります。

すべてのログメッセージには、先頭に「hsdk-」が付いており、HERE SDKからのメッセージを簡単に識別できます。

また、LogAppenderインターフェースを使用すると、独自のログクラスをLogControlクラスに挿入できます。これにより、さまざまなランタイム条件に基づいてログメッセージをフィルタリングできます。たとえば、logLevelErrorタイプのエラーのみをログに記録するように選択できます。デフォルトでは、このようにログを選択的に記録することはできません。これは、どのメッセージの記録を許可するかを判断するのはログ階層のみであり、HERE SDKの初期化後にこの最小レベルを調整することはできないためです。ただし、独自のロギングクラスを追加すると、完全に制御できるようになります。

iOSシミュレーターの実行時に、ターミナルから次のコマンドを実行して、Xcodeを実行せずにログを取得できます。

xcrun simctl spawn booted log stream --level debug

有意義なログを生成する

多くの問題について、Xcode に表示されるログには、最も関連性の高い情報がすでに含まれています。クラッシュや ANR については、さらに掘り下げて、次のようにデバイス ログを確認できます。

  1. Xcode を開き、デバイスを接続します。
  2. Xcode で、[Window](ウィンドウ) の上部メニュー バー タブをクリックします。
  3. [Device and Simulation](デバイスとシミュレーター) をタップします。
  4. [View Device Logs](デバイス ログを表示) をタップしするか、最新の Xcode バージョンでは、[Open Recent Logs](最近のログを開く) または [Open Console](コンソールを開く) をタップします。

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); })();