iOS 開発者ガイド for SDK

CLE2 オフラインを使用しています

検索リクエストは、サーバーに対してオンラインで、またはローカルデバイスに対してオフラインで実行できます。 ローカルデータに対するオフライン検索を有効にするため に、 HERE SDK ではデータを事前取得するさまざまな方法が用意されています。

オフライン モードには次の利点があるため、できるだけ多くの利点があります。

  • ネットワークの不安定性に対する耐障害性。
  • ネットワーク帯域幅をより効率的に使用できます。 オブジェクトごとに 1 つのリクエストを送信する代わりに、リクエストをローカルに集約し、データをバッチで送信できます。
  • ネットワーク帯域幅の節約。 アプリでは、ユーザーの現在の場所の近くでのみデータをキャッシュおよび更新できます。また、レイヤーをプレダウンロードできるのは、 Wi-Fi ネットワークが利用可能になった場合のみです。
  • データがすでにローカルでデバイスで利用できるようになっているため、アプリケーションの応答性が向上し、ユーザー体験とインターフェイスのやり取りが改善される可能性があります。
  • HERE SDK を使用 してジオメトリを作成または変更し、 HERE SDK をデータソースおよび情報のストレージとして使用して、ローカルで効率的にジオメトリを保存します。

オフラインの CLE2 機能は、簡単に使用できるように設計されています。 すべてのデータベースの同期化と地理空間関連の複雑さは SDK によって処理されるため、アプリ開発の他の部分に集中できます。

ローカルストレージを照会しています

ローカルに保存されたデータを使用して検索するには NMACLE2ConnectivityModeOffline 、任意ののののの接続モードをに設定 NMACLE2Request し、要求を実行します。

// Create any request as normal
// In this example we use the proximity request:
NMACLE2ProximityRequest *proximityRequest;
proximityRequest = [[NMACLE2ProximityRequest alloc]
            initWithLayer:@"HERE_SITES"
                 center:[NMAGeoCoordinates geoCoordinatesWithLatitude:50.113905
                                      longitude:8.677608]
                 radius:500]; // 500 meters

// Set to offline mode:
proximityRequest.connectivityMode = NMACLE2ConnectivityModeOffline;

// Now perform the request
[proximityRequest startWithBlock:^(NMACLE2Request *request, NMACLE2Result *result, NSError *error) {
  if(!error) {
    NSLog(@"Geometries returned in result.geometriesArray came from the device local storage.");
  }
}];

検索リクエストをハイブリッドモードまたは自動モードに設定して、オンラインリクエスト中に接続が切断された場合、またはネットワークエラーが発生した場合に、リクエストが自動的にオフライン操作に戻るように指定できます。 検索の実行に使用された接続モードを確認することで、検索がオンラインまたはオフラインのどちらで実行されたかを確認できます。 これを行うに connectivityModeUsedNMACLE2Result は、オブジェクトのプロパティを確認します。

// Create any request as normal;
// In this example we use the proximity request:
NMACLE2ProximityRequest *proximityRequest;
proximityRequest= [[NMACLE2ProximityRequest alloc]
          initWithLayer:@"HERE_SITES"
               center:[NMAGeoCoordinates geoCoordinatesWithLatitude:50.113905
                                    longitude:8.677608]
               radius:500]; // 500 meters

// Set to automatic mode
proximityRequest.connectivityMode = NMACLE2ConnectivityModeAutomatic;

// now calling a startWithBlock will try an online request, if it fails, the offline storage kicks in
[proximityRequest startWithBlock:^(NMACLE2Request *request, NMACLE2Result *result, NSError *error) {
  if(!error) {
    NSLog(@"Geometries returned in result.geometriesArray.");
    // to find out whether this response came from the local storage or was
    // obtained from the server (online request), check the requestMode property:
    NMACLE2ConnectivityMode connectivityModeUsed = result.connectivityModeUsed;
  }
  }];

ローカルストレージにデータを入力する方法

デフォルトでは、オフライン機能は無効になっており、ローカルストレージにはデータが含まれていません。 現在、オフライン検索で使用できるようにジオメトリを追加するには、次の 3 つの方法があります。

  1. 1 つ以上のリクエストを実行するときにキャッシュを有効 NMACLE2ProximityRequestにします ( 例 : を使用 ) 。
  2. 1 つ以上のレイヤーをダウンロードします。
  3. ローカルデータベースにデータを直接挿入します。

データベースにデータを入力した後、各リクエストの接続モードをに切り替えること NMACLE2ConnectivityModeOfflineで、通常どおりオフライン モードでデータをクエリーできます。

NMACLE2DataManager および NMACLE2Task

NMACLE2DataManager このオブジェクトは、ローカルストレージとの中央の対話ポイントです。 この機能を使用すると、次のことが可能になります。

  • 特定のレイヤーのすべてのジオメトリをダウンロードします
  • 現在合計または特定のレイヤーに保存されているジオメトリの数を確認します
  • 特定のレイヤーに属するジオメトリを削除します
  • すべてのアイテムを削除して、ローカルストレージを消去します
  • ローカルまたはリモートのジオメトリを作成、更新、または削除します

NMACLE2DataManager 公開さ NMACLE2Task れているデータ管理に関連するすべての操作で、作業単位を表すを使用します。 すべてのデータ管理操作にデータベースアクセス、ネットワーク通信、またはその両方が含まれているため NMACLE2Task 、は非同期で実行されます。 NMACLE2Task からオブジェクトを取得 NMACLE2DataManagerできます。

NMACLE2Task は、次のことができます

  • コードの他の部分に渡し NMACLE2Task ます。は、自己完結型の作業単位です。
  • 操作の結果をサブスクライブします。 複数のサブスクライバがサポートされ、メインスレッドで呼び出されます。
  • タスクの実行を開始します。 タスクは再利用できます。 複数回繰り返し実行できるため、失敗した操作の再試行が非常に簡単になります。
  • 実行中のタスクをキャンセルします。
  • タスクが開始されているかどうかを確認してください。
  • タスクが完了したかどうかを確認してください。
  • タスクが完了するまで待ちます。
  • タスクから、完了した操作のステータスを直接取得します ( エラーを確認 ) 。
  • 正常に終了した操作の結果をタスクから直接取得します。

検索結果をキャッシュしてデータを保存しています

でキャッシュが有効になっている場合 NMACLE2Request、返されたすべてのジオメトリが自動的にローカルに保存されます。 アクティブ化するには cacheEnabledYES 、リクエストを実行する前にプロパティをに設定します。

// Create any request as normal;
// In this example we use the proximity request:
NMACLE2ProximityRequest *proximityRequest;
proximityRequest = [[NMACLE2ProximityRequest alloc] initWithLayer:@"HERE_SITES"
     center:[NMAGeoCoordinates geoCoordinatesWithLatitude:50.113905
                          longitude:8.677608]
     radius:500]; // 500 meters

// activate caching:
proximityRequest.cachingEnabled = YES;

// Now perform the request
[proximityRequest startWithBlock:^(NMACLE2Request *request, NMACLE2Result *result, NSError *error) {
  if(!error) {
    NSLog(@"Geometries returned in result.geometriesArray are now stored in the local database.");
  }
}];

// now some geometries are in local storage. At a later point in time if we'd like to make an offline search,
// simply switch the requesMode to offline only in the request:
proximityRequest.connectivityMode = NMACLE2ConnectivityModeOffline;

// now calling a startWithBlock will operate completely offline:
[proximityRequest startWithBlock:^(NMACLE2Request *request, NMACLE2Result *result, NSError *error) {
  if(!error) {
    NSLog(@"Geometries returned in result.geometriesArray are now stored in the local database.");
  }
}];

レイヤーをダウンロードしてデータを保存しています

2 つ目のオプションは、downloadLayerメソッドを使用してローカルストレージにデータを挿入するためにNMACLE2DataManager使用します。

downloadLayerTask メソッドの使用例を次に示します。


// Usage examples of NMACLE2DataManager

NMACLE2DataManager *dataManager = [NMACLE2DataManager sharedManager];
// 1 - Download a layer previously uploaded to the server
NMACLE2Task<NMACLE2OperationResult *> *task = [dataManager downloadLayerTask:@"LOCAL_SHOPS"];
[task subscribeWithBlock:^(NMACLE2OperationResult * _Nonnull result, NSError * _Nonnull error) {
  if (error) {
    NSLog(@"Unable to download layer. Error: %@", [error description]);
  } else {
    NSLog(@"Layers downloaded successfully.");
  }
}];
[task start];

// 2 - Print the total number of stored geometries (sum of all downloaded layers),
// plus any cached geometries (e.g., from a proximity request with cache enabled)
NSNumber *numberOfGeometries;
NSError *error;
numberOfGeometries = [dataManager numberOfStoredGeometriesinLayer:@"LOCAL_SHOPS" onError:&error];

NSLog(@"Total count: %lli", [numberOfGeometries longLongValue]);

// 3 - Delete all geometries from a specific layer
NMACLE2Task<NMACLE2OperationResult*> *deleteTask;
deleteTask = [[NMACLE2DataManager sharedManager] deleteLayersTask: @[@"LOCAL_SHOPS"]
                            fromStorage:NMACLE2StorageTypeLocal];
[deleteTask subscribeWithBlock:^(NMACLE2OperationResult * _Nonnull result, NSError * _Nonnull error) {
  if (error) {
     NSLog(@"Unable to delete layer. Error: %@", [error description]);
  } else {
    NSLog(@"Layers deleted successfully.");
  }
}];
[deleteTask start];

NMACLE2Task<NMACLE2OperationResult *> *purgeTask;
purgeTask = [[NMACLE2DataManager sharedManager] purgeLocalStorageTask];
[purgeTask subscribeWithBlock:^(NMACLE2OperationResult * _Nonnull result, NSError * _Nonnull error) {
  if (error) {
    NSLog(@"Failed to purge local storage: %@", [error description]);
  }
}];
[purgeTask start];

形状を挿入してデータを保存しています

geometryTask:onLayer:withGeometries:inStorage:NMACLE2DataManager クラスのメソッドを使用すると、位置情報ベースのデータを生成し、ローカル、リモート、またはその両方に保持できます。 このファクトリメソッドは NMACLE2Task 、いつでも操作の結果を開始、キャンセル、または取得するために使用できるオブジェクトを返します。

  geometryTask:(NMACLE2Operation)operationType
     onLayer:(NSString*)layerId
withGeometries:(NSArray<NMACLE2Geometry *>*)geometriesArray
   inStorage:(NMACLE2StorageType)storage;
  • このメソッドの最初のパラメータは、次のいずれかの操作タイプを記述します。
    • NMACLE2OperationTypeCreate
    • NMACLE2OperationTypeUpdate
    • NMACLE2OperationTypeDelete
    ジオメトリのクエリは NMACLE2Request 、それぞれの特殊なクラスを介して実行されるため、「読み取り」の操作 HERE は作成されません。
  • 2 番目のパラメーターは、操作を適用するレイヤーです。
  • 3 番目のパラメーターは、形状自体を含むリストです。
  • 最後のパラメータでNMACLE2StorageTypeLocalNMACLE2StorageTypeRemoteは、 HERE CLE2 サーバを使用して、ローカルストレージ () またはリモートストレージ () のどちらで操作するかを定義します。
注 : このセクションでは、ローカルオプションでのこのメソッドの使用方法について説明しますが、すべての操作 ( 作成、更新、削除 ) を使用してリモートレイヤーを変更することもできます。

次の例では、形状を作成してローカルに保存する方法を示します。

NSMutableArray <NMACLE2Geometry *> *geometriesToAdd = [NSMutableArray new];
for (int i = 0; i < 100; ++i) {
   NMACLE2GeometryPoint *newPoint = [[NMACLE2GeometryPoint alloc] init];
   NSString *key = [NSString stringWithFormat:@"key_%i", i];
   NSString *valueString = @"hello";
   newPoint.attributes = [@{ key : @"value",
              @"HERE_SDK" : @"3.21",
              @"Some_numbers" : valueString,
              @"New_Feature" : @"Offline functionality \U0001F44C"} mutableCopy];
   newPoint.coordinates = [[NMAGeoCoordinates alloc] initWithLatitude: i % 180 longitude:i % 359];
   [geometriesToAdd addObject:newPoint];
}

NMACLE2Task<NMACLE2OperationResult*> *task;
task = [[NMACLE2DataManager sharedManager] geometryTask:NMACLE2OperationTypeCreate
                         onLayer:@"LOCAL_POINTS_TEST_LAYER"
                    withGeometries:geometriesToAdd
                       inStorage:NMACLE2StorageTypeLocal];
[task subscribeWithBlock:^(NMACLE2OperationResult * _Nonnull result, NSError * _Nonnull error) {
   if (error) {
     NSLog(@"error: %@", [error description]);
   } else {
     NSLog(@"Finished for layer %@", @"LOCAL_POINTS_TEST_LAYER");
   }
}];
[task start];

ローカルレイヤーをアップロードしています

ローカルに保存されたレイヤーをサーバーにアップロードできます。 この処理には 2 つの操作 ( ローカルストレージからのフェッチとアップロード ) が必要なため、コールバックへの侵入を防ぐために、個々のタスクを同期的に実行することをお勧めします。 もちろん、これは AsyncTask などの独自のスレッドで行う必要があります。

// first fetch all geometries
NMACLE2DataManager *dataManager = [NMACLE2DataManager sharedManager];
NSString *layerId = @"LAYER";
NMACLE2Task<NSMutableArray<NMACLE2Geometry *> *> *fetchTask;
fetchTask = [dataManager fetchLocalLayersTask:@[layerId]];
[fetchTask startWithBlock:^(NSMutableArray <NMACLE2Geometry *> *_Nonnull result, NSError *_Nonnull error) {
  if (error) {
    NSLog(@"Error fetching local geometries: %@", error.description);
    return;
  }
  // Success, upload all geometries from the selected local layer
  NMACLE2Task<NMACLE2OperationResult *> *uploadtask;
  uploadtask = [dataManager uploadLayerTask:layerId withGeometries:result];
  // start the upload
  [uploadtask startWithBlock:^(NMACLE2OperationResult *_Nonnull result, NSError *_Nonnull error) {
    if (error) {
      NSLog(@"Upload error: %@", error.description);
      return;
    }
    NSLog(@"Layer Upload Complete. %@ geometries uploaded.", result.affectedItemCount);
  }];
}];

データ管理に関する考慮事項

オフラインで CLE2 を使用する場合にデータ管理を行う際に役立つヒントを次に示します。

ローカルのみの形状

すべての NMACLE2Geometry オブジェクトには、次のプロパティがあります。

  1. ジオメトリ ID 。でアクセスできます geometryId
  2. locality フラグ。でアクセスできます isLocal

ジオメトリ ID はレイヤーに固有です。 ジオメトリオブジェクトが作成されたばかりの場合、そのジオメトリ ID はで nil 、ローカル性フラグはです NO

locality フラグは、このジオメトリがローカルコンテキストにのみ属しているかどうかを示します。つまり、このジオメトリは取得されなかったか、 CLE2 サーバーを通過しなかったことを示します。 true 局所性フラグが設定されたジオメトリには、ローカルで生成された一意のジオメトリ ID があります。 それ以外の場合は、サーバー指定の ID が含まれます。 このサーバー指定の ID は、によって作成 geometryTask:onLayer:withGeometries:inStorage:されたデータベースに直接保存されている形状のローカルで生成された ID には関連付けられません。

注 : サーバーを通過せずにジオメトリをローカルに保存する機能が提供されているため、接続が利用できない場合に、これらのオブジェクトのデータの永続性を管理する必要はありません。

簡単にするために、ジオメトリをローカルデータベースに直接保存する場合は、別のレイヤー名を使用してジオメトリを保持してください。 後で必要な時点でこれらのジオメトリをサーバーと共有する必要がある場合 fetchLocalLayersTask:NMACLE2DataManageruploadLayerTask:withGeometries:geometryTask:onLayer:withGeometries:inStorage:NMACLE2OperationTypeCreateは、のメソッドを使用してすべてのローカルジオメトリを取得し、または作成操作 () を使用してアップロードします。 これにより isLocal 、プロパティを確認する必要がなくなります。

これらの概念を使用すると、ジオメトリを異なるレイヤーやコンテキストに移動し、これらのツールを使用してデータを整理できます。

データの整合性

の使用 uploadLayerTask:withGeometries: は、主に管理者ユーザーに限定する必要があります。この方法では、サーバー内の既存のすべてのジオメトリが削除され、提供されているジオメトリを使用してレイヤーが再作成されるためです。 ユーザーがこのレイヤーの最新の情報を持っていない場合、別のユーザーのアップロードが上書きされる可能性があるため、データが失われる可能性があります。

したがって、連続的または同時的なジオメトリのアップロードを行うシナリオで geometryTask:onLayer:withGeometries:inStorage: は、 NMACLE2OperationTypeCreate メソッドをまたはで使用 NMACLE2OperationTypeUpdateします。 「追加のみ」の方法で操作するか、または既存のジオメトリのみを更新することで、ユーザーがジオメトリをサーバーに同時にアップロードしている場合でもデータの損失を防止できます。

現在の制限事項

現在、 CLE2 サーバの個別化されたユーザーアカウント管理は利用できません。 セキュリティ上の理由から、アプリ資格情報を完全に非表示にしておくように注意してください。 アプリケーションでユーザーアカウントのアクセス機能が必要な場合 は、 サービスサポートに連絡して詳細を確認してください

注 : 地理空間クエリーは CLE2 の中心であるため 、 HERE SDK ではオフライン モードでの属性検索をサポートしていません。 いずれかの地理空間クエリ ( 近接など ) を使用してデータをフィルタリングし、ほとんどのアプリケーションでパフォーマンスへの影響を受けないほど少ない数の結果に絞り込むことができます。そのためには、ジオメトリ属性のキー値辞書を反復して、結果をさらにフィルタリングします。