Driver SDK for iOS のスタートガイド

Driver SDK は、ドライバアプリに統合するライブラリです。内容 ドライバーの位置情報、ルート、位置情報に基づいて Fleet Engine を 残り距離、到着予定時刻が表示されますまた、Navigation SDK との統合により、 ターンバイターン方式のナビをドライバーに提示します。

最小システム要件

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

    このガイドでは、アプリに Navigation SDK を実装し、 フリート エンジン 使用できることを確認します。サンプルコードでは こちらのサンプルをご覧ください。 Navigation SDK

    また、Maps SDK for iOS も有効にする必要があります。 」と入力して API キーを取得します。

    ローカルでの開発

    ローカルで開発する場合は、 Cloud SDK

    gcloud

    gcloud auth login
    

    ログインに使用するメールアドレスは、Workspace グループのメンバーである必要があります。

    自動化(ビルドシステムまたは継続的インテグレーション)

    以下に従って自動化ホストを設定する ベスト プラクティス:

    • プロセスが Google Cloud 環境内で実行される場合は、 自動 認証情報の検出などを行います。

    • それ以外の場合は、サービス アカウント キー ファイルを 設定し、環境変数に GOOGLE_APPLICATION_CREDENTIALS 環境変数を適切に設定します。

    認証情報に関連付けられたサービス アカウントのメールアドレスは、 。

    プロジェクト構成

    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 のスタートガイド ガイド 表示されます。

    手動インストール

    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 バックエンドに送信すると、 リクエストに有効なアクセス トークンを含める必要があります。Google Cloud で Driver SDK はリクエストを認証するために、 GMTDAuthorization 構成されます。このオブジェクトは、必要なアクセス トークンを提供する役割を担います。

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

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

    Fleet Engine サーバーによって予期されるトークンの詳細については、以下をご覧ください。 認可用の JSON Web Token(JWT)を作成する

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

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

    #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 {
      if (!completion) {
        NSAssert(NO, @"%s encountered an unexpected nil completion.", __PRETTY_FUNCTION__);
        return;
      }
    
      // 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 vehicle token 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
    

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

    GMTDDeliveryVehicleReporter インスタンスを取得するには、まず、 providerID を使用して GMTDDeliveryDriverAPI インスタンスを指定し、 VehicleID、driverContext、accessTokenProvider ですproviderID は Google Cloud プロジェクト ID。また、GMTDDeliveryVehicleReporter にアクセスできます。 ドライバ API から直接アクセスできます。

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

    #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];
    
      GMTDDeliveryDriverAPI *deliveryDriverAPI = [[GMTDDeliveryDriverAPI alloc] initWithDriverContext:driverContext];
    }
    

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

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

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

    • vehicleReporter:didSucceedVehicleUpdate

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

    • vehicleReporter:didFailVehicleUpdate:withError

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

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

    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 IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
      [ridesharingDriverAPI.vehicleReporter addListener:self];
    }
    
    - (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didSucceedVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate {
      // Handle update succeeded.
    }
    
    - (void)vehicleReporter:(GMTDDeliveryVehicleReporter *)vehicleReporter didFailVehicleUpdate:(GMTDVehicleUpdate *)vehicleUpdate withError:(NSError *)error {
      // Handle update failed.
    }
    
    @end
    

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

    位置情報追跡を有効にするには、アプリで locationTrackingEnabledYES に設定します。 (GMTDDeliveryVehicleReporterGMTDDeliveryVehicleReporter は次のようになります。 自動的に現在地の更新情報が送信されます。GMSNavigator がナビゲーション内にある場合 モード(デスティネーションが setDestinations によって設定されている場合) locationTrackingEnabledYES に設定されます。GMTDDeliveryVehicleReporter では、 ルートや到着予定時刻の更新情報も 自動的に送信します

    これらの更新中に設定されたルートは、ドライバーが移動したルートと同じになります。 ナビゲーションセッション中に 移動することもできますしたがって、配送追跡が機能するように -setDestinations:callback: で設定されたウェイポイントは、 Fleet Engine バックエンドで設定された宛先の数を表します。

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

    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 IMPLEMENTED HAVE THE SAMPLE CODE UP TO THIS STEP.
      deliveryDriverAPI.vehicleReporter.locationTrackingEnabled = YES;
    }
    
    @end
    

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

    位置情報の更新を無効にする

    アプリは、車両の位置情報の更新を無効にすることができます。たとえば、 運転手のシフトが終了したときに、アプリで locationTrackingEnabledNO に設定できます。

      _vehicleReporter.locationTrackingEnabled = NO
    

    update_mask エラーを処理する

    GMTDDeliveryVehicleReporter が車両の最新情報を送信すると、update_mask このエラーは、マスクが空の場合に発生することがあります。これは、通常、最初の 更新します。次の例は、このエラーを処理する方法を示しています。

    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