Driver SDK for iOS スタートガイド

Driver SDK を使用すると、ナビゲーションとトラッキングの強化を 移動と注文の進行状況アプリケーション。Driver SDK は On-demand Rides and Deliveries Solution Fleet Engine に位置情報とタスクを更新します。

Driver SDK を使用すると、Fleet Engine サービスとカスタム サービスで 車両の位置と状態を指定します。たとえば、車両は ONLINE または OFFLINE: ルートの進行に伴って車両の位置情報が変化する。

最小システム要件

  • モバイル デバイスに iOS 14 以降が搭載されている必要があります。
  • Xcode バージョン 15 以降。
  • 前提条件

    このガイドでは、アプリに Navigation API が実装されていることを前提としています。 SDKフリートの エンジン 使用できることを確認します。ただし、サンプルコードでは、インフラストラクチャの Navigation SDK の設定方法

    また、Maps SDK for iOS も有効にする必要があります。 Google Cloud プロジェクトに保存してAPI を Key です。

    Project Configuration

    Swift Package Manager

    Driver SDK は からインストールできます。 Swift Package Manager。SDK を追加するには、 Driver SDK の既存の依存関係をすべて削除しました。

    新規または既存のプロジェクトに SDK を追加する手順は次のとおりです。

    1. Xcode project または workspace を開き、[File >パッケージの依存関係を追加する
    2. URL として「https://github.com/googlemaps/ios-driver-sdk」と入力し、Enter キーを押します。 [パッケージを追加]をクリックします
    3. 特定の version をインストールするには、[Dependency Rule] フィールドを次のいずれかに設定します。 オプションを提供します。新しいプロジェクトの場合は、最新バージョンと 1 つのバージョンを 「正確なバージョン」を使用して選択します。完了したら、[Add Package] をクリックします。
    4. [Choose Package Products] ウィンドウで、GoogleRidesharingDriver が以下に追加されることを確認します。 指定したmainの目標値。完了したら、[Add Package] をクリックします。
    5. インストールを確認するには、ターゲットの General ペインに移動します。 [Frameworks, Libraries, and Embedded Content] に、インストールされたパッケージが表示されます。 [Package Dependencies] ビューもセクション(プロジェクト ナビゲーター) パッケージとそのバージョンを確認します。

    既存のプロジェクトの package を更新する手順は次のとおりです。

    1. 9.0.0 より前のバージョンからアップグレードする場合は、 次の依存関係: GoogleMapsBaseGoogleMapsCore、 アップグレード後に GoogleMapsM4B。次の依存関係を削除しないでください。 GoogleMaps。詳しくは、 バージョン 9.0.0 リリースノート

      Xcode プロジェクト構成設定で、フレームワーク、ライブラリ、 および埋め込みコンテンツをご覧ください。マイナス記号(-)を使用して、次のフレームワークを削除します。

      • GoogleMapsBase(9.0.0 より前のバージョンからのアップグレードのみ)
      • GoogleMapsCore(9.0.0 より前のバージョンからのアップグレードのみ)
      • GoogleMapsM4B(9.0.0 より前のバージョンからのアップグレードのみ)
    2. Xcode で、[File] > [パッケージ >最新のパッケージ バージョンへの更新」を選択します。
    3. インストールを確認するには、Project Navigator の [Package Dependencies] セクションに移動します。 パッケージとそのバージョンを確認します。
    で確認できます。 <ph type="x-smartling-placeholder">

    以下を使用して追加された既存の Driver SDK 依存関係を削除するには、 CocoaPods の手順は次のとおりです。

    1. Xcode ワークスペースを閉じます。ターミナルを開き、次のコマンドを実行します。
      sudo gem install cocoapods-deintegrate cocoapods-clean 
      pod deintegrate 
      pod cache clean --all
    2. PodfilePodfile.resolved、および CocoaPods 以外で使用していない場合には、Xcode workspace です。

    インストールされている既存の Driver SDK を削除するには 次の操作を行います。

    1. Xcode プロジェクト構成設定で、フレームワーク、 ライブラリ、および埋め込みコンテンツマイナス記号(-)を使って削除します。 次のフレームワークを使用します。

      • GoogleRidesharingDriver.xcframework
    2. Xcode プロジェクトの最上位ディレクトリから、 GoogleRidesharingDriver セット。

    CocoaPods

    CocoaPods を使用して Driver SDK を構成するには、次のものが必要です。

    • CocoaPods ツール: このツールをインストールするには、ターミナルを開いて次のコマンドを実行します。 次のコマンドを実行します。
       sudo gem install cocoapods
    
    1. Driver SDK の Podfile を作成し、それを使用して API をインストールします。 依存関係: Podfile という名前のファイルをプロジェクト ディレクトリに作成します。 このファイルでプロジェクトの依存関係を定義します。Podfile を編集して、 確認します。依存関係を含む例を次に示します。

      source "https://github.com/CocoaPods/Specs.git"
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GoogleRidesharingDriver'
      end
      

      ここに示す例には、Terraform の Alpha Pod と Beta Pod が含まれています。 Driver SDK を依存関係として使用する場合:

      source "https://cpdc-eap.googlesource.com/ridesharing-driver-sdk.git"
      source "https://github.com/CocoaPods/Specs.git"
      
      target 'YOUR_APPLICATION_TARGET_NAME_HERE' do
        pod 'GoogleRidesharingDriver'
      end
      
    2. Podfile を保存します。ターミナルを開き、ターミナルを含むディレクトリに移動します。 Podfile:

      cd <path-to-project>
      
    3. Pod インストール コマンドを実行します。これにより、指定した API がインストールされます。 Podfile とそれらの依存関係が存在します。

      pod install
      
    4. Xcode を閉じて、プロジェクトの .xcworkspace を開く(ダブルクリック) Xcode を起動します。これ以降は、 .xcworkspace ファイルを開いてプロジェクトを開きます。

    で確認できます。

    詳しくは、CocoaPods のスタートガイド ガイド 表示されます。

    手動インストール

    XCFramework は、インストールに使用するバイナリ パッケージで、 Driver SDKこのパッケージは複数の プラットフォーム(Apple シリコン。このガイドでは、 XCFramework を手動で追加し、 Driver SDK をプロジェクトに追加してビルドを設定する Xcode で設定します。

    SDK バイナリとリソースをダウンロードします。

    1. ファイルを解凍して、XCFramework とリソースにアクセスします。

    2. Xcode を起動し、既存のプロジェクトを開くか、新しいプロジェクトを作成します。 できます。iOS を初めて使用する場合は、新しいプロジェクトを作成して [iOS] を選択します。 アプリ テンプレート。

    3. フレームワーク グループが存在しない場合は、プロジェクト グループにフレームワーク グループを作成します。 すでにあります。

    4. Driver SDK をインストールするには、 GoogleRidesharingDriver.xcframework ファイルを、 フレームワーク、ライブラリ、埋め込みコンテンツ。プロンプトが表示されたら、 必要に応じてアイテムをコピーします。

    5. ダウンロードした GoogleRidesharingDriver.bundle をトップレベルにドラッグします ディレクトリに移動します。プロンプトが表示されたら、[Copy items if needed] を選択します。

    6. プロジェクト ナビゲータでプロジェクトを選択し、 通信できます。

    7. [Build Phases] タブを開き、[Link Binary with Libraries] に、 次のフレームワークとライブラリがまだ存在しない場合は、

      • Accelerate.framework
      • AudioToolbox.framework
      • AVFoundation.framework
      • CoreData.framework
      • CoreGraphics.framework
      • CoreLocation.framework
      • CoreTelephony.framework
      • CoreText.framework
      • GLKit.framework
      • ImageIO.framework
      • libc++.tbd
      • libxml2.tbd
      • libz.tbd
      • LocalAuthentication.framework
      • OpenGLES.framework
      • QuartzCore.framework
      • SystemConfiguration.framework
      • UIKit.framework
      • WebKit.framework
    8. 特定のターゲットではなくプロジェクトを選択して、[Build 設定タブ。[その他のリンカーフラグ] セクションで、-ObjC デバッグとリリースの両方に対応しています。これらの設定が表示されない場合は、 Build 設定バーで [Basic] から [All] にフィルタします。

    Apple Privacy Manifest ファイルを調べる

    Apple が App Store のアプリについては、アプリのプライバシーに関する詳細情報を必要とします。最新情報などについては、Apple App Store のプライバシーの詳細ページをご覧ください。

    Apple Privacy Manifest ファイルは、SDK のリソース バンドルに含まれています。プライバシー マニフェスト ファイルが含まれていることを確認し、その内容を検査するには、アプリのアーカイブを作成し、そのアーカイブからプライバシー レポートを生成します。

    認可と認証を実装する

    ドライバアプリが更新を生成して Fleet Engine バックエンドに送信すると、 リクエストに有効なアクセス トークンを含める必要があります。認可と認証を行う Driver SDK はこれらのリクエストの実行時に、 GMTDAuthorization プロトコルに準拠するこのオブジェクトは 提供します。

    トークンの生成方法は、アプリ デベロッパーが選択します。お客様の実装 次の機能を提供する必要があります。

    • HTTPS サーバーからアクセス トークン(JSON 形式など)をフェッチします。
    • トークンを解析してキャッシュに保存します。
    • 期限切れになったらトークンを更新します。

    Fleet Engine サーバーによって予期されるトークンの詳細については、 JSON Web Token(JWT)を 承認します

    プロバイダ ID は Google Cloud プロジェクト ID と同じです。Fleet Engine をご覧ください。 クイックスタート ガイド をご覧ください。

    次の例では、アクセス トークン プロバイダを実装しています。

    Swift

    import GoogleRidesharingDriver
    
    private let providerURL = "INSERT_YOUR_TOKEN_PROVIDER_URL"
    
    class SampleAccessTokenProvider: NSObject, GMTDAuthorization {
      private struct AuthToken {
        // The cached vehicle token.
        let token: String
        // Keep track of when the token expires for caching.
        let expiration: TimeInterval
        // Keep track of the vehicle ID the cached token is for.
        let vehicleID: String
      }
    
      enum AccessTokenError: Error {
        case missingAuthorizationContext
        case missingData
      }
    
      private var authToken: AuthToken?
    
      func fetchToken(
        with authorizationContext: GMTDAuthorizationContext?,
        completion: @escaping GMTDAuthTokenFetchCompletionHandler
      ) {
        // Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
        guard let authorizationContext = authorizationContext else {
          completion(nil, AccessTokenError.missingAuthorizationContext)
          return
        }
        let vehicleID = authorizationContext.vehicleID
    
        // If appropriate, use the cached token.
        if let authToken = authToken,
          authToken.expiration > Date.now.timeIntervalSince1970 && authToken.vehicleID == vehicleID
        {
          completion(authToken.token, nil)
          return
        }
    
        // Otherwise, try to fetch a new token from your server.
        let request = URLRequest(url: URL(string: providerURL))
        let task = URLSession.shared.dataTask(with: request) { [weak self] data, _, error in
          guard let strongSelf = self else { return }
          guard error == nil else {
            completion(nil, error)
            return
          }
    
          // Replace the following key values with the appropriate keys based on your
          // server's expected response.
          let vehicleTokenKey = "VEHICLE_TOKEN_KEY"
          let tokenExpirationKey = "TOKEN_EXPIRATION"
          guard let data = data,
            let fetchData = try? JSONSerialization.jsonObject(with: data) as? [String: Any],
            let token = fetchData[vehicleTokenKey] as? String,
            let expiration = fetchData[tokenExpirationKey] as? Double
          else {
            completion(nil, AccessTokenError.missingData)
            return
          }
    
          strongSelf.authToken = AuthToken(
            token: token, expiration: expiration, vehicleID: vehicleID)
          completion(token, nil)
        }
        task.resume()
      }
    }
    

    Objective-C

    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    // SampleAccessTokenProvider.h
    @interface SampleAccessTokenProvider : NSObject<GMTDAuthorization>
    @end
    
    static NSString *const PROVIDER_URL = @"INSERT_YOUR_TOKEN_PROVIDER_URL";
    
    // SampleAccessTokenProvider.m
    @implementation SampleAccessTokenProvider{
      // The cached vehicle token.
      NSString *_cachedVehicleToken;
      // Keep track of the vehicle ID the cached token is for.
      NSString *_lastKnownVehicleID;
      // Keep track of when tokens expire for caching.
      NSTimeInterval _tokenExpiration;
    }
    
    -   (void)fetchTokenWithContext:(nullable GMTDAuthorizationContext *)authorizationContext
                       completion:(nonnull GMTDAuthTokenFetchCompletionHandler)completion {
      // Get the vehicle ID from the authorizationContext. This is set by the Driver SDK.
      NSString *vehicleID = authorizationContext.vehicleID;
      if (!vehicleID) {
        NSAssert(NO, @"Vehicle ID is missing from authorizationContext.");
        return;
      }
    
      // Clear cached vehicle token if vehicle ID has changed.
      if (![_lastKnownVehicleID isEqual:vehicleID]) {
        _tokenExpiration = 0.0;
        _cachedVehicleToken = nil;
      }
      _lastKnownVehicleID = vehicleID;
    
      // Clear cached vehicletoken if it has expired.
      if ([[NSDate date] timeIntervalSince1970] > _tokenExpiration) {
        _cachedVehicleToken = nil;
      }
    
      // If appropriate, use the cached token.
      if (_cachedVehicleToken) {
        completion(_cachedVehicleToken, nil);
        return;
      }
      // Otherwise, try to fetch a new token from your server.
      NSURL *requestURL = [NSURL URLWithString:PROVIDER_URL];
      NSMutableURLRequest *request =
          [[NSMutableURLRequest alloc] initWithURL:requestURL];
      request.HTTPMethod = @"GET";
      // Replace the following key values with the appropriate keys based on your
      // server's expected response.
      NSString *vehicleTokenKey = @"VEHICLE_TOKEN_KEY";
      NSString *tokenExpirationKey = @"TOKEN_EXPIRATION";
      __weak typeof(self) weakSelf = self;
      void (^handler)(NSData *_Nullable data, NSURLResponse *_Nullable response,
                      NSError *_Nullable error) =
          ^(NSData *_Nullable data, NSURLResponse *_Nullable response, NSError *_Nullable error) {
            typeof(self) strongSelf = weakSelf;
            if (error) {
              completion(nil, error);
              return;
            }
    
            NSError *JSONError;
            NSMutableDictionary *JSONResponse =
                [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&JSONError];
    
            if (JSONError) {
              completion(nil, JSONError);
              return;
            } else {
              // Sample code only. No validation logic.
              id expirationData = JSONResponse[tokenExpirationKey];
              if ([expirationData isKindOfClass:[NSNumber class]]) {
                NSTimeInterval expirationTime = ((NSNumber *)expirationData).doubleValue;
                strongSelf->_tokenExpiration = [[NSDate date] timeIntervalSince1970] + expirationTime;
              }
              strongSelf->_cachedVehicleToken = JSONResponse[vehicleTokenKey];
              completion(JSONResponse[vehicleTokenKey], nil);
            }
          };
      NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
      NSURLSession *mainQueueURLSession =
          [NSURLSession sessionWithConfiguration:config delegate:nil
                                   delegateQueue:[NSOperationQueue mainQueue]];
      NSURLSessionDataTask *task = [mainQueueURLSession dataTaskWithRequest:request completionHandler:handler];
      [task resume];
    }
    
    @end
    

    RidesharingDriverAPI インスタンスを作成する

    GMTDVehicleReporter インスタンスを取得するには、まず、 GMTDRidesharingDriverAPI driveContext と accessTokenProvider です。providerID は Google ID と同じです。 Cloud プロジェクト ID。また、GMTDVehicleReporter インスタンスには、 直接使用できます。

    次の例では、GMTDRidesharingDriverAPI インスタンスを作成します。

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
        let vehicleID = "INSERT_CREATED_VEHICLE_ID"
        let accessTokenProvider = SampleAccessTokenProvider()
        let driverContext = GMTDDriverContext(
          accessTokenProvider: accessTokenProvider,
          providerID: providerID,
          vehicleID: vehicleID,
          navigator: mapView.navigator)
        let ridesharingDriverAPI = GMTDRidesharingDriverAPI(driverContext: driverContext)
      }
    }
    

    Objective-C

    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      NSString *vehicleID = @"INSERT_CREATED_VEHICLE_ID";
      SampleAccessTokenProvider *accessTokenProvider =
                                    [[SampleAccessTokenProvider alloc] init];
      GMTDDriverContext *driverContext =
        [[GMTDDriverContext alloc] initWithAccessTokenProvider:accessTokenProvider
                                                    providerID:PROVIDER_ID
                                                     vehicleID:vehicleID
                                                     navigator:_mapView.navigator];
    
      GMTDRidesharingDriverAPI *ridesharingDriverAPI = [[GMTDRidesharingDriverAPI alloc] initWithDriverContext:driverContext];
    }
    

    必要に応じて VehicleReporter イベントをリッスンする

    GMTDVehicleReporter は、次のタイミングで定期的に車両を更新します。 locationTrackingEnabledtrue です。このような定期的な更新に対応するために、 オブジェクトは、次に準拠することで、GMTDVehicleReporter イベントをサブスクライブできます。 GMTDVehicleReporterListener プロトコル。

    次のイベントを処理できます。

    • vehicleReporter(_:didSucceed:)

      バックエンド サービスが受信メッセージを正常に受信したことをドライバー アプリに通知します。 車両の位置情報と状態を更新します。

    • vehicleReporter(_:didFail:withError:)

      車両の更新に失敗したことをリスナーに通知します。ロケーション限り トラッキングが有効になっていても、GMTDVehicleReporter は引き続き最新のデータを送信します Fleet Engine バックエンドに送信します。

    次の例では、これらのイベントを処理します。

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        ridesharingDriverAPI.vehicleReporter.add(self)
      }
    
      func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didSucceed vehicleUpdate: GMTDVehicleUpdate) {
        // Handle update succeeded.
      }
    
      func vehicleReporter(_ vehicleReporter: GMTDVehicleReporter, didFail vehicleUpdate: GMTDVehicleUpdate, withError error: Error) {
        // Handle update failed.
      }
    }
    

    Objective-C

    /*
    
        *   SampleViewController.h
     */
    @interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
    @end
    
    /*
    
        *   SampleViewController.m
     */
    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      [ridesharingDriverAPI.vehicleReporter addListener:self];
    }
    
    -   (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
      // Handle update succeeded.
    }
    
    -   (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
      // Handle update failed.
    }
    
    @end
    

    GMTDVehicleReporter をリスナーとして GMSRoadSnappedLocationProvider に追加

    Driver SDK に位置情報の更新を提供するには、GMTDVehicleReporter GMSRoadSnappedLocationProvider のリスナーとして設定する必要があります。

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        if let roadSnappedLocationProvider = mapView.roadSnappedLocationProvider {
          roadSnappedLocationProvider.add(ridesharingDriverAPI.vehicleReporter)
          roadSnappedLocationProvider.startUpdatingLocation()
        }
      }
    }
    

    Objective-C

    /*
    
        *   SampleViewController.h
     */
    @interface SampleViewController : UIViewController<GMTDVehicleReporterListener>
    @end
    
    /*
    
        *   SampleViewController.m
     */
    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      [_mapView.roadSnappedLocationProvider addListener:ridesharingDriverAPI.vehicleReporter];
      [_mapView.roadSnappedLocationProvider startUpdatingLocation];
    }
    
    @end
    

    位置情報追跡を有効にする

    位置情報追跡を有効にするには、アプリで locationTrackingEnabledGMTDVehicleReportertrueGMTDVehicleReporter は自動的に 位置情報の更新サービスが一致し、車両をルートに割り当てたら、 GMSNavigator になると GMTDVehicleReporter がルートの更新情報を自動送信します ナビゲーション モードになっている(setDestinations でデスティネーションが設定されている場合)。

    ルートの更新時に設定されたルートは、ドライバーが使用しているルートと同じになります。 ナビゲーションセッション中に 移動することもできますそのため、ジャーニーを setDestinations で設定されたウェイポイントは、 Fleet Engine バックエンドで設定された宛先の数を表します。

    locationTrackingEnabledtrue に設定されている場合は、ルートと車両の最新情報が送信されます。 Fleet Engine バックエンドに一定の間隔で送信されます。 locationUpdateIntervallocationTrackingEnabledfalse に設定されている場合: 更新が停車地に更新され、最終的な車両更新リクエストが Fleet Engine に送信されます。 車両の状態を GMTDVehicleState.offline に設定します。詳しくは、 updateVehicleState locationTrackingEnabled のときのエラー処理に関する特別な考慮事項 false に設定されます。

    次の例では、位置情報追跡を有効にします。

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = true
      }
    }
    

    Objective-C

    /*
        *   SampleViewController.m
     */
    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      ridesharingDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
    }
    
    @end
    

    デフォルトでは、レポート間隔は 10 秒ですが、 locationUpdateInterval で変更できます。サポートされている最小更新間隔 5 秒です。サポートされている最大更新間隔は 60 秒です。頻繁 リクエストやエラーが遅くなる可能性があります。

    車両の状態を更新する

    次の例は、車両の状態を ONLINE に設定する方法を示しています。詳しくは、 updateVehicleState をご覧ください。

    Swift

    import GoogleRidesharingDriver
    
    private let providerID = "INSERT_YOUR_PROVIDER_ID"
    
    class SampleViewController: UIViewController, GMTDVehicleReporterListener {
      private let mapView: GMSMapView
    
      override func viewDidLoad() {
        // Assumes you have implemented the sample code up to this step.
        ridesharingDriverAPI.vehicleReporter.update(.online)
      }
    }
    

    Objective-C

    #import "SampleViewController.h"
    #import "SampleAccessTokenProvider.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    static NSString *const PROVIDER_ID = @"INSERT_YOUR_PROVIDER_ID";
    
    @implementation SampleViewController {
      GMSMapView *_mapView;
    }
    
    -   (void)viewDidLoad {
      // Assumes you have implemented the sample code up to this step.
      [ridesharingDriverAPI.vehicleReporter
                                       updateVehicleState:GMTDVehicleStateOnline];
    }
    
    @end
    

    update_mask エラーは、マスクが空の場合に発生することがあります。通常、このエラーが発生します。 自動的にダウンロードされます。次の例は、BigQuery から このエラーが表示されます。

    Swift

    import GoogleRidesharingDriver
    
    class VehicleReporterListener: NSObject, GMTDVehicleReporterListener {
      func vehicleReporter(
        _ vehicleReporter: GMTDVehicleReporter,
        didFail vehicleUpdate: GMTDVehicleUpdate,
        withError error: Error
      ) {
        let fullError = error as NSError
        if let innerError = fullError.userInfo[NSUnderlyingErrorKey] as? NSError {
          let innerFullError = innerError as NSError
          if innerFullError.localizedDescription.contains("update_mask cannot be empty") {
            emptyMaskUpdates += 1
            return
          }
        }
        failedUpdates += 1
      }
    
      override init() {
        emptyMaskUpdates = 0
        failedUpdates = 0
      }
    }
    
    

    Objective-C

    #import "VehicleReporterListener.h"
    #import <GoogleRidesharingDriver/GoogleRidesharingDriver.h>
    
    @implementation VehicleReporterListener {
      NSInteger emptyMaskUpdates = 0;
      NSInteger failedUpdates = 0;
    }
    
    -   (void)vehicleReporter:(GMTDVehicleReporter *)vehicleReporter
       didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate
                  withError:(NSError *)error {
      for (NSError *underlyingError in error.underlyingErrors) {
        if ([underlyingError.localizedDescription containsString:@"update_mask cannot be empty"]) {
          emptyMaskUpdates += 1;
          return;
        }
      }
      failedUpdates += 1
    }
    
    @end
    

    位置情報の更新を無効にして、車両をオフラインにする

    アプリで更新を無効にし、車両をオフラインにすることができます。たとえば、 運転手のシフトが終了したときに、アプリで locationTrackingEnabledfalse に設定できます。 更新を無効にすると、Fleet Engine でも車両のステータスが OFFLINE に設定されます バックエンドです。

    Swift

    vehicleReporter.locationTrackingEnabled = false
    

    Objective-C

    _vehicleReporter.locationTrackingEnabled = NO;