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 です。

    プロジェクト構成

    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] セクションに移動します。 パッケージとそのバージョンを確認します。

    以下を使用して追加された既存の 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 のスタートガイド ガイド 表示されます。

    手動インストール

    <ph type="x-smartling-placeholder">

    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;